Andreas: Code anzeigen lassen, nicht ausführen

Hallo,
wie kann ich z.B. PHP-Code anzeigen lassen, ohne dass der Code ausgeführt wird?
ich habe es mit
$text = str_replace("<","&lt;",$text);
$text = str_replace(">","&gt;",$text);

versucht, aber das Problem ist nun dass aus Zeilenumbrüchen <br /> werden und aus value="wert" wird value=\"wert\"

Wie muss ich den Text richtig formatieren dass er auch richtig ausgegeben wird?

Gruß Andreas

  1. Ahoi Andreas,

    ich habe es mit
    $text = str_replace("<","&lt;",$text);
    $text = str_replace(">","&gt;",$text);

    versucht, aber das Problem ist nun dass aus Zeilenumbrüchen <br /> werden und aus value="wert" wird value=\"wert\"

    aber garantiert nicht durhc diesen code, zeilenumbrüche => <br />
    entsteht durch nl2br. value="wert" => value=\"wert\" durch
    fehlendes stripslasches, oder gar ein addslashes.

    MfG

    --
    Alle Angaben wie immer ohne Gewähr
    PPPS: ich trinke gerne ab und an mal eine tote Tante.
    1. Hello,

      versucht, aber das Problem ist nun dass aus Zeilenumbrüchen <br /> werden und aus value="wert" wird value=\"wert\"

      aber garantiert nicht durhc diesen code, zeilenumbrüche => <br />
      entsteht durch nl2br. value="wert" => value=\"wert\" durch
      fehlendes stripslasches, oder gar ein addslashes.

      Was vermuten lässt, dass er den Code mittels Textarea erfasst und dann nach dem Post anzeigen lassen will.

      Harzliche Grüße vom Berg
      esst mehr http://www.harte-harzer.de

      Tom

      --
      Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
      Nur selber lernen macht schlau
    2. Hallo

      aber garantiert nicht durhc diesen code, zeilenumbrüche => <br />
      entsteht durch nl2br. value="wert" => value=\"wert\" durch
      fehlendes stripslasches, oder gar ein addslashes.

      Die <br /> stehen ja in der MySQL-Tabelle. Hätte ich erwähnen sollen.
      Ansonsten ist es so wie ich gesagt habe, nur diese beiden Codeanweisungen.

      Andreas

      1. Ahoi Andreas,

        Die <br /> stehen ja in der MySQL-Tabelle. Hätte ich erwähnen sollen.

        und warum stehen die dort? weil vor dem insert ein nl2br gemacht wurde.

        MfG

        --
        Alle Angaben wie immer ohne Gewähr
        PPPS: ich trinke gerne ab und an mal eine tote Tante.
        1. Hallo

          und warum stehen die dort? weil vor dem insert ein nl2br gemacht wurde.

          Aber das ist doch nicht relevant, ich will die vorliegenden Daten ausgeben. Klar hab ich ein nl2br() vor dem Speichern in die Tabelle gemacht, sonst wären die Zeilenumbrüche ja weg.

          Gruß und Danke noch für deine Hilfe.
          Andreas

          1. Ahoi Andreas,

            Aber das ist doch nicht relevant, ich will die vorliegenden Daten ausgeben. Klar hab ich ein nl2br() vor dem Speichern in die Tabelle gemacht, sonst wären die Zeilenumbrüche ja weg.

            nein wären sie AFAIK nicht. du musst das ganze nur vor der ausgabe machen. oder ein <pre></pre> drumrum setzten.

            MfG

            --
            Alle Angaben wie immer ohne Gewähr
            PPPS: ich trinke gerne ab und an mal eine tote Tante.
  2. Hello,

    schau Dir mal highlight_file() an.
    http://de.php.net/manual/en/function.highlight-file.php

    Harzliche Grüße vom Berg
    esst mehr http://www.harte-harzer.de

    Tom

    --
    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
    Nur selber lernen macht schlau
    1. Hallo,

      schau Dir mal highlight_file() an.
      http://de.php.net/manual/en/function.highlight-file.php

      warum highlight_file?, wenn schon hightlight_string().

      Aber das bringt mir nichts, das färbt mir den ganzen Code-Teil nur rot ein.

      Ich werde es mit Stripslashes versuchen.

      Gruß Andreas

      1. Hello,

        Hallo,

        schau Dir mal highlight_file() an.
        http://de.php.net/manual/en/function.highlight-file.php
        warum highlight_file?, wenn schon hightlight_string().

        nur die halbe Wahrheit sagen und dann auch noch pampig werden?

        Aber das bringt mir nichts, das färbt mir den ganzen Code-Teil nur rot ein.

        Das liegt an Deiner Gesinnung ;-)

        Ich werde es mit Stripslashes versuchen.

        Genau.

        Und dann villeicht mit eval()?

        Harzliche Grüße vom Berg
        esst mehr http://www.harte-harzer.de

        Tom

        --
        Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
        Nur selber lernen macht schlau
  3. Moin!

    wie kann ich z.B. PHP-Code anzeigen lassen, ohne dass der Code ausgeführt wird?

    Wo drin anzeigen lassen?

    [ ] Im Browser im Fließtext
    [ ] Im Browser in einer Textarea
    [ ] Im Quelltexteditor
    [ ] Im WYSIWYG-Editor
    [ ] Im Fernsehen

    ich habe es mit
    $text = str_replace("<","&lt;",$text);
    $text = str_replace(">","&gt;",$text);

    [ ] Du kennst htmlspecialchars()

    versucht, aber das Problem ist nun dass aus Zeilenumbrüchen <br /> werden und aus value="wert" wird value=\"wert\"

    [ ] Du kennst die Einstellung von magic_quotes_gpc (z.B. in der php.ini) und berücksichtigst es.

    Wie muss ich den Text richtig formatieren dass er auch richtig ausgegeben wird?

    Hängt davon ab, was du wo tun willst.

    - Sven Rautenberg

    1. Hallo,

      OK, geb zu, meine Frage war total schwammig. Mit anzeigen habe ich gemeint den Text in einer Tabellenzelle anzeigen.

      Ich habe es jetzt so gelöst, wobei ich zwar vom Ergebnis nicht aber mit der Umsetzung zufrieden bin, doch seht selbst:

      $tutorial = str_replace("<br />", "[br]", $tutorial);
      $tutorial = htmlspecialchars($tutorial);
      $tutorial = stripslashes($tutorial);
      $tutorial = str_replace("[br]", "<br>", $tutorial);

      Ich habe es nicht anderst geschaft den Zeilenumbruch hinzubekommen als über diese Krücke. Aber so klappt es jetzt wenigstens.

      Gruß Andreas

      1. Moin!

        Ich habe es jetzt so gelöst, wobei ich zwar vom Ergebnis nicht aber mit der Umsetzung zufrieden bin, doch seht selbst:

        Dein Problem ist, dass du offenbar schon vor dem Speichern die Zeilenumbrüche durch <br> ergänzt. Sowas macht man nicht, sondern speichert immer in der unmodifiziertesten Form.

        Erst bei der Ausgabe kann man dann entsprechend der lokalen Erfordernisse weitere Umwandlungen vornehmen.

        $tutorial = str_replace("<br />", "[br]", $tutorial);
        $tutorial = htmlspecialchars($tutorial);
        $tutorial = stripslashes($tutorial);
        $tutorial = str_replace("[br]", "<br>", $tutorial);

        Wenn in deinem Text jetzt zufällig der String "[br]" enthalten ist, was dann?

        - Sven Rautenberg

        1. Hallo,

          Dein Problem ist, dass du offenbar schon vor dem Speichern die Zeilenumbrüche durch <br> ergänzt. Sowas macht man nicht, sondern speichert immer in der unmodifiziertesten Form.

          Ja das stimmt. Vor dem Speichern wandele ich Zeilenumbrüche mit nl2br() um. Wenn ich das nicht mache, gehen die Umbrüche dann nicht verloren? Ich war bisher immer dieser Meinung.

          Wenn in deinem Text jetzt zufällig der String "[br]" enthalten ist, was dann?

          OK, davon gehe ich jetzt nicht aus ;)

          Gruß Andreas

          1. Moin!

            Ja das stimmt. Vor dem Speichern wandele ich Zeilenumbrüche mit nl2br() um. Wenn ich das nicht mache, gehen die Umbrüche dann nicht verloren? Ich war bisher immer dieser Meinung.

            Hängt davon ab, wie und wo du speicherst.

            Wenn in deinem Text jetzt zufällig der String "[br]" enthalten ist, was dann?
            OK, davon gehe ich jetzt nicht aus ;)

            Aber weißt du das? Nehmen wir mal dieses Forum hier. Einige Leute haben es aus Angst, dass HTML interpretiert werden könnte, schon geschafft, sämtliche < und > in [ und ] zu schreiben, folglich käme wie von selbst auch mal [br] vor, obwohl das eigentlich nicht vorgesehen ist.

            - Sven Rautenberg

  4. echo $begrüßung;

    Wie muss ich den Text richtig formatieren dass er auch richtig ausgegeben wird?

    Wenn ich mal zusammenfassen darf...

    Du hast hier mehrere Probleme auf einmal, hausgemachte durch Nichtwissen und welche durch unbeachtete "schlechte" Eigenschaften von PHP.

    Für das Backslash-Problem sind die sicher die Magic Quotes zuständig. Verstehe deren Konzept... und schalte diesen Mechanismus aus, weil er mehr Blödsinn anstellt als Nutzen bringt. Wenn du keinen Zugriff auf die Konfiguration hast, wende stripslashes_deep() aus dem Example 2 auf der Handbuchseite zu stripslashes() auf alle Eingabedaten ($_GET, $_POST, $_COOKIES) an.

    Damit sind deine Eingabedaten bereinigt. Intern verarbeiten sich Daten am besten, wenn sie in ihrer Rohform vorliegen und auch noch keine störenden Ausgabeformatierungen enthalten.

    Wenn Daten ausgegeben werden sollen, dann sind sie dem Ausgabemedium entsprechend zu maskieren. Für MySQL gibt es mysql_real_escape_string(), für HTML tut es htmlspecialchars().

    Zeilenumbrüche werden, wenn sie richtig maskiert werden auch ohne Probleme verarbeitet. Für MySQL kümmert sich darum das bereits erwähnte mysql_real_escape_string(). Damit sie in HTML zur Geltung kommen sind sie als <br> zu schreiben (nl2br() hilft) oder der Text ist als preformatiert auszu zeichnen <pre></pre>.

    echo "$verabschiedung $name";

    1. Moin!

      Zeilenumbrüche werden, wenn sie richtig maskiert werden auch ohne Probleme verarbeitet. Für MySQL kümmert sich darum das bereits erwähnte mysql_real_escape_string(). Damit sie in HTML zur Geltung kommen sind sie als <br> zu schreiben (nl2br() hilft) oder der Text ist als preformatiert auszu zeichnen <pre></pre>.

      Die Ausgabe in HTML kann sehr verschieden sein.

      Zum einen kann der gespeicherte String 1:1 HTML-Quellcode darstellen. Dann muß man keinerlei Umwandlung mehr vornehmen, auch kein nl2br, weil alle gewünschten Zeilenumbrüche ja schon als <br> im Quelltext drinstehen, und alle Newline-Zeichen allerhöchstens den Quelltext nett formatieren, aber nicht optisch gelten sollen.

      Will man diesen Quelltext aber in einer Textarea zur Bearbeitung anbieten, ist er mit htmlspecialchars() zu wandeln, weil innerhalb einer Textarea sowieso keine HTML-Tags vorkommen dürfen, und deshalb die Tag-Zeichen < und > als &lt; und &gt; geschrieben werden müssen. Ebenso muß das Und-Zeichen als &amp; geschrieben werden - und wenn dann im Quelltext eben Entities vorkommen wie &auml;, dann werden die in der Textarea eben wirklich als "&auml;" angezeigt (in die Textarea ausgegeben als "&amp;auml;"), und nicht als "ä" - alles andere ist grundsätzlich nicht möglich zu wandeln, ohne in Probleme zu geraten.

      Man kann den String aber auch als darzustellenden Text ausgeben wollen. Dann sind die HTML-Zeichen < und > natürlich als solches auszugeben, also mit htmlspecialchars(), und damit die Zeilenumbrüche sichtbar werden, ist nl2br() anzuwenden.

      So einen String in einer Textarea ist zwar auch mit htmlspecialchars() zu versehen, aber nl2br() muß in diesem Fall unterbleiben, weil die Zeilenumbrüche im String von der Textarea schon als Umbruch erkannt und angezeigt werden.

      Eine Stringausgabe innerhalb von <pre> hat auch keine Notwendigkeit für nl2br(), und evtl. auch keine für die Tag-Zeichen < und >, wenn man im String HTML-Formatierungen erlauben will. Es ist allerdings für die Verarbeitungslogik schlauer, derartige Formatierungen in einem Meta-Code zu speichern, oder beispielsweise einen BBCode-Parser für sowas zu verwenden, denn je nach Anwendung kann es böse sein, wenn wirklich beliebiges HTML durchkommt.

      - Sven Rautenberg

      1. Hallo,
        danke für eure Hilfe, werde den Code nochmals umbauen.
        Aber mit <pre></pre> hab ich ein Problem.
        Der Text wird im Template in einer Tabellenzelle dargestellt:

        <td colspan="3" align="left" width="100%">
        <div class=codeheader>Code:</div><div class=code>
        <pre>{$tutorial}</pre>
        </div>
        </td>

        Problem ist nun dass diese Tabellenzelle durch das pre derart in die Breite gezogen wird, so breit halt wie die breiteste Codezeile.

        Wie kann ich den Text umbrechen, so dass die gewünschte Breite erhältlich ist?

        Andreas

        1. Moin!

          Aber mit <pre></pre> hab ich ein Problem.
          Der Text wird im Template in einer Tabellenzelle dargestellt:

          Problem ist nun dass diese Tabellenzelle durch das pre derart in die Breite gezogen wird, so breit halt wie die breiteste Codezeile.

          Das ist die eigentliche Funktion von <pre>, und es ist eigentlich auch sehr gut, dass das so ist, denn bei manchen Programmiersprachen kommt es wirklich drauf an, wo die Zeilenumbrüche sind, weil die es sind, die die Befehle trennen.

          Mit anderen Worten: Wenn du den Text schmaler haben willst, mußt du deinen Text an den passenden Stellen manuell und syntaktisch korrekt umbrechen.

          Die Alternative wäre natürlich, mit wordwrap() zu arbeiten - das Ergebnis ist dann aber nicht zwingend gültiger Code und sieht u.U. auch nicht schön eingerückt aus.

          Noch besser wäre, das <pre> mit lokalen Scrollbalken zu versehen: overflow:scroll und width-Angabe, evtl. auch height-Angabe. Dann hat man ein IFrame-ähnliches Fenster für den Quelltext.

          - Sven Rautenberg