Razor: Problem mit PHP Highlighting und Templates

Hi,

folgendes Szenario:

ich habe ein kleines Gästebuch in PHP geschrieben. Das Gästebuch wird komplett per Templates designt. Im Gästebuch soll es möglich sein PHP Code zu schreiben, der dann gehighlighted wird. Dazu muss der Code zwischen den BBCode Tags [PHP] und [/PHP] stehen.

Und hier kommt das Problem ins Spiel. Dieser PHP Code soll nämlich in einer Tabelle stehen bei der Ausgabe. Natürlich liegt auch diese Tabelle in einer Template Datei, muss also eingelesen werden. Ich ersetze die [PHP] Tags per preg_replace. Ich bekomme es zwar hin, dass der PHP Code in der aus dem Template eingelesenen Tabelle steht, aber ich schaffe es einfach nicht den zu Highlighten. Logischerweise steht in der Templatedatei $1, was dann eben durch den PHP Code ersetzt wird. Aber wie highlighte ich den vorher?

Ich sitze schon Stunden an dem Problem, aber ich komm nicht weiter. Wäre echt toll, wenn mir jemand von euch helfen könnte.

Gruß, Razor

  1. Hallo,

    Highlichte doch den code schon vorher!!!
    Mit $1 = highlight($1); oder so, hab grad keine Ahnung wie der Befehl lautet!

    samy,

    1. Ja wenns so einfach wäre. WIe soll ich ihn denn dann ins Template reinbekommen?

  2. Hallo Razor!

    Aber wie highlighte ich den vorher?

    Einfach highlight_string() avor auf den String anwenden?
    Lesetip: http://de3.php.net/manual/en/function.highlight-string.php

    MfG
    Götz

    --
    Losung für Freitag, 9. April 2004
    Wer dem Geringen Gewalt tut, lästert dessen Schöpfer. (Sprüche 14,31)
    Die Soldaten schlugen Jesus mit einem Rohr auf das Haupt und spien ihn an und fielen auf die Knie und huldigten ihm. (Markus 15,19)
    (http://www.losungen.de/heute.php3)
    1. Das ist ein weiteres Problem. Sage ich ihm er solls mal nur durch highlight_string($1) ersetzen, bekomme ich den Fehler Expecting T_VARIABLE $....

      1. Hallo Razor!

        Das ist ein weiteres Problem. Sage ich ihm er solls mal nur durch highlight_string($1) ersetzen, bekomme ich den Fehler Expecting T_VARIABLE $....

        hä? Da machst Du dann irgendetws falsch.
        Du mußt Deine vorhandene "Regel" einfach um einen Befehl erweitern, das sollte doch möglich sein.

        Ohne den Quelltext zu sehen kann man dazu nichts genaueres sagen (aber poste jetzt ja nicht zig Codezeilen rein...).

        MfG
        Götz

        --
        Losung für Freitag, 9. April 2004
        Wer dem Geringen Gewalt tut, lästert dessen Schöpfer. (Sprüche 14,31)
        Die Soldaten schlugen Jesus mit einem Rohr auf das Haupt und spien ihn an und fielen auf die Knie und huldigten ihm. (Markus 15,19)
        (http://www.losungen.de/heute.php3)
        1. Ohne den Quelltext zu sehen kann man dazu nichts genaueres sagen (aber poste jetzt ja nicht zig Codezeilen rein...).

          keine Sorge, ist ja alles schön gegliedert:

          zu ersetzen: "~[PHP](.*?)[/PHP]~i"

          durch: highlight_string($1)

          die beiden stehen jeweils in extra arrays und werden dann von preg_replace durchlaufen. Solange ich nicht highlighte klappt alles wunderbar.

          1. Hallo Razor!

            zu ersetzen: "~[PHP](.*?)[/PHP]~i"
            durch: highlight_string($1)

            Du mußt vielleicht erstmal $1 als Variable speichern (also von den [PHP] trennen), dann highlight_string() drauf anwenden, und dann wieder "zusammenbauen".
            Ohne diesen Zwischenschritt geht es vermutlich nicht.

            MfG
            Götz

            --
            Losung für Freitag, 9. April 2004
            Wer dem Geringen Gewalt tut, lästert dessen Schöpfer. (Sprüche 14,31)
            Die Soldaten schlugen Jesus mit einem Rohr auf das Haupt und spien ihn an und fielen auf die Knie und huldigten ihm. (Markus 15,19)
            (http://www.losungen.de/heute.php3)
            1. Diesen Weg habe ich mir zuerst natürlich auch überlegt. So einfach geht das natürlich nicht, weil preg_replace ja sonst nicht direkt ersetzen kann. ALso dachte ich mir ich probiere es das Ganze in einer extra Funktion zu verarbeiten, aber auch das hat nicht gefruchtet, hat irgendwie denselben Fehler ergeben.

              1. Hallo Razor!

                Du mußt erst irgendwie Deinen zu highlightenden String von den "[PHP]" und "[/PHP]" trennen.
                Das kann man ja zur Not auch mit substr() oder so machen.
                Dann hast Du erstmal den zu highlightenden String in ner Variable.
                Auf diese wird dann highlight_string() angewendet.
                Dann wird einfach dem gehighlighteten String wieder "[PHP]" vorangestellt und "[/PHP]" angehängt, das sollte imho eigentlich funktionieren. (auch ohne preg_match())

                MfG
                Götz

                --
                Losung für Samstag, 10. April 2004
                Stehe auf, o Gott, richte die Erde! denn dein Eigentum sind die Völker alle. (Psalm 82,8)
                Wer an den Sohn glaubt, der wird nicht gerichtet. (Johannes 3,18)
                (http://www.losungen.de/heute.php3)
                1. Also ich hab mich jetzt nochmal etwas rumgespielt und bin soweit gekommen, dass es mit einer externen Funktion funktioniert. Also ich übergebe der Funktion den gefundenen Wert in der Form \1 also php_highlight("\1")

                  Mache ich in der Funktion kein highlight_string mit dem übergebenen Wert sondern irgendwas anderes, bekomme ich ganz normal den Wert zurück. Mache ich aber ein highlight_string bekomme ich nur \1 zurück :)
                  Ich raffs jetzt echt nicht mehr. Ich speicher das schon in dutzende Variablen um wandle es nochmal extra in einen String um und trotzdem bekomme ich \1 zurück. Ohne highlight_string() angwandt ist alles ok, dann liefert ers normal zurück.

                  An eine Übergabe ala $1 ist nicht zu denke, die führt in jeglicher Form zu einem parse error T_VARIABLE etc.

                  Das gibt es doch gar nicht *heul* ich verzweifle hier noch. :'((

                  1. Hallo Razor!

                    Mache ich in der Funktion kein highlight_string mit dem übergebenen Wert sondern irgendwas anderes, bekomme ich ganz normal den Wert zurück. Mache ich aber ein highlight_string bekomme ich nur \1 zurück :)

                    Vielleicht bringt es was, wenn Du den 2. Parameter bei highlight_string() auf True setzt.

                    MfG
                    Götz

                    --
                    Losung für Samstag, 10. April 2004
                    Stehe auf, o Gott, richte die Erde! denn dein Eigentum sind die Völker alle. (Psalm 82,8)
                    Wer an den Sohn glaubt, der wird nicht gerichtet. (Johannes 3,18)
                    (http://www.losungen.de/heute.php3)
                    1. Wusste gar nicht, dass es einen 2. Parameter gibt. Was bewirkt der denn? Jedenfalls, wenn ich den auf true setze, gehts mit highlight_string, aber der Text wird nicht gehighlighted ausgegeben. Also er gibt mir zwar den Code statt dem \1 aus, aber nix mit highlight Farben.

                      1. Hallo Razor!

                        Wusste gar nicht, dass es einen 2. Parameter gibt. Was bewirkt der denn?

                        Siehe http://de.php.net/manual/en/function.highlight-string.php.
                        (die englischen Manualseiten sind meist aktueller als die deutschen ... meist macht es wohl wenig, hier machts wohl schon was aus ;)

                        Jedenfalls, wenn ich den auf true setze, gehts mit highlight_string, aber der Text wird nicht gehighlighted ausgegeben. Also er gibt mir zwar den Code statt dem \1 aus, aber nix mit highlight Farben.

                        Vielleicht solltest Du Deinem zu highlightenden String vorm Highlighten noch <?php voranstellen und ?> anhängen, ich vermute, daß die highlight-Funktion dies so haben will.
                        Mußt halt ggf. wenn Dus am Ende nicht mit drin haben willst wieder entfernen.

                        Und jetzt geh ich mal schlafen ... ;)

                        MfG
                        Götz

                        --
                        Losung für Samstag, 10. April 2004
                        Stehe auf, o Gott, richte die Erde! denn dein Eigentum sind die Völker alle. (Psalm 82,8)
                        Wer an den Sohn glaubt, der wird nicht gerichtet. (Johannes 3,18)
                        (http://www.losungen.de/heute.php3)
                        1. Hallo,

                          Vielleicht solltest Du Deinem zu highlightenden String vorm Highlighten noch <?php voranstellen und ?> anhängen, ich vermute, daß die highlight-Funktion dies so haben will.

                          Genau so klappt das, siehe http://forum.de.selfhtml.org/archiv/2003/11/62908/#m356257.

                          MfG, Thomas

                          --
                          SVG - Learning By Coding
                          http://svglbc.datenverdrahten.de/
          2. Hallo Razor,

            zu ersetzen: "~[PHP](.*?)[/PHP]~i"

            dir könnte der e-modifier helfen - damit wird bei preg_replace im ersetzen-Teil auch php geparst (siehe auch http://de2.php.net/pcre.pattern.modifiers und das 4.Beispiel auf http://de2.php.net/function.preg-replace). Das könnte dann etwas so aussehen (ungetestet):

            $text = preg_replace("~[PHP](.*?)[/PHP]~ei","highlight_string($1)",$text);

            Grüße aus Nürnberg
            Tobias

            --
            Selfcode: sh:( fo:) ch:? rl:( br:< n4:& ie:% mo:| va:) de:] zu:) fl:( ss:| ls:[ js:|
            1. Das geht leider gar nicht, weil dann will er ja den PHP Code auch parsen, was natürlich unweigerlich zu einer Fehlermeldung führt.

              1. Hallo Razor,

                Das geht leider gar nicht, weil dann will er ja den PHP Code auch parsen, was natürlich unweigerlich zu einer Fehlermeldung führt.

                stimmt (ich habe es mal ausprobiert) - ich habe aber noch eine andere Idee :-) - verwende preg_replace_callback:

                $text = preg_replace_callback("~[PHP](.*?)[/PHP]~i","hs",$text);

                wobei der zweite Parameter einen Funktionsnamen erwartet. Die Funktion hs (du kannst ja einen aussagekräftigeren Namen vergeben) sieht so aus:

                function hs($m){ return highlight_string($m[1],true); }

                ggf. musst du eben noch innerhalb der Funktion hs Sachen die dir nicht gefallen (z.B. <font> durch <span> o.ä.) ersetzen. Wichtig ist der 2. Parameter der Funktion highlight_string der dafür sorgt, dass die Funktion den farbigen code zurück-, und nicht direkt ausgibt (das funktioniert allerdings erst ab Version 4.2.0).

                Grüße aus Nürnberg
                Tobias

                --
                Selfcode: sh:( fo:) ch:? rl:( br:< n4:& ie:% mo:| va:) de:] zu:) fl:( ss:| ls:[ js:|
                1. Es klappt leider auch nicht, der Text bleibt farblos. Habe aber PHP 4.3.?

                  1. Hallo Razor,

                    Es klappt leider auch nicht, der Text bleibt farblos.

                    der Code muss von '<?php' und '?>' umschlossen sein (wie Götz in [pref:t=78233&m=452256] bemerkt hat) und außerdem brauchst du hinter dem regulären Ausdruck noch ein 's' (damit erkennt der Punkt auch Zeilenumbrüche), also so:
                      ~[PHP](.*?)[/PHP]~is

                    • ich hoffe das funktioniert jetzt endlich :-)
                      Wenn nicht, poste mal etwas Code wie es bei dir im Moment aussieht.

                    Grüße aus Nürnberg
                    Tobias

                    --
                    Selfcode: sh:( fo:) ch:? rl:( br:< n4:& ie:% mo:| va:) de:] zu:) fl:( ss:| ls:[ js:|
                    1. Ich werds mir morgen weiter ansehen, momentan kann ich nicht mehr weiter, bin schon total wirr im Hirn :)
                      Danke für eure Hilfe bis jetzt.