Problem mit Anführungszeichen bei preg_replace
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
anregung
beispiel
beitrag
dokument
eigene funktion
eingabe
funktion
funktioniert bestens
gen
highlight
komma
kurzer sinn
leerer variable
match
nutzer
puffer
sonderzeichen
texteingabe
variable
zauberwort
-
In der folgenden Skriptzeile soll eingegebener Quelltext in HTML-Sonderzeichen umgewandelt werden.
$bb_code = preg_replace('!\[code\](.*?)\[/code\]!ie', "'[code\]'.htmlentities(\"$2\").'[/code\]'", $bb_code);
Das funktioniert so lange gut, bis PHP-Code - d.h. Variablen eingegeben werden. Durch die doppelten Anf?hrungszeichen (\"$2\") wird in dem String nach Variablen gesucht und die Werte werden eingesetzt.
HTML-Beispiel:
Eingabestring : <div id="ich_bin_ein_div"></div>
Ausgabestring : &lt;div id="ich_bin_ein_div"&gt;&lt;/div&gt;
PHP-Beispiel:
Eingabestring : <? echo $var; ?>
Ergebnis (bei leerer Variable): &lt;? echo ; ?&gt;
Wie kann ich den Code trotzdem 'sichtbar' machen?
Beitrag ge?ndert am 15.04.2006 23:31 von tuvalu -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Soweit ich wei? wird in den Doppeltenanf?rhurngszeichen (") immer auch die Variable ersetzt. Ansonsten muss man meines Wissens anch einfache Anf?hrungszeichen nehmen (') Dabei wird snstat des Variablenwertes der Variablenname ausgegeben, da der Wert nicht gesucht wird. ;)
also anstatt "" '' nehmen. Soltle klappen..... -
soweit war ich bisher auch selbst gekommen, nur dann wird logischerweise $2 oder \\2 ausgegeben, da die Variable $2 nicht ersetzt wird, sondern als String angesehen wird und eben nicht als Variable.
Auch durch das einf?gen von
$bb_code = addslashes($bb_code);
?ndert sich nichts.
Beitrag ge?ndert am 16.04.2006 11:23 von tuvalu -
Ein Nutzer kann eine Texteingabe machen. Diese Eingabe darf mit HTML formatiert sein. Nun kann der Nutzer z.B. [b\] oder [i\]... eingeben um seinen Text zu formatieren. Es ist nur BB-CODE erlaubt.
Der Nutzer kann aber nun auch Quelltexte einf?gen und diesen, wie bei lima city, durch [code] formatieren.
Der eingegebene Quelltext wird, wenn dieser HTML ist, nicht als Text dargestellt, sondern vom Browser interpretiert. Mit htmlentities() kann dieser in Sonderzeichen umgewandelt werden.
Bei HTML funktionier alles einwandfrei. Wenn der Nutzer nun PHP-Quelltexte eintippt, so werden Variablen mit den Werten der Variablen in meinem Dokument ersetzt - (Das hast du ja verstanden)
Nun w?rde ich gern wissen, wie ich dieses Ersetzung vermeiden kann und den Code, in Sonderzeichen umgewandelt, darstellen kann.
Beitrag ge?ndert am 16.04.2006 11:37 von tuvalu -
Ich kenne dein Problem, da ich es selber hatte. Ich wollte n?mlich einen eingegebenen (php-)Code highlighten und es wollte einfach nicht gehn. Im Inet hab ich auch keine passenden L?sungen gefunden, immernur so teilweise Sachen, die mir nicht wirklich geholfen haben.
Lange Rede, kurzer Sinn: Ich hab mir selbst was gebastelt. Vll hilft dir das, auch wenn du es nicht direkt verwenden kannst, so als Anregung. Das Zauberwort hei?t "puffern". Aber hier mal der Code mit ein paar Kommentaren.
$text=preg_replace_callback('|\[code\](.*)\[code\]|Usi', 'php_string', $text); //ruft die Funktion php_string auf und ?bergibt den Treffer (.*), erwartet Wert zur?ck
function php_string($matches) // die Funktion php_string
{
$text=html_entity_decode($matches[1]); // htmlentities r?ckg?ngig machen
$text=str_replace('<?','',$text); // wenn ein <? vorhanden, dann l?schen (macht n?mlich Probleme wenn das im Text steht, auch hier bei lima weshalb ich grade nicht mit [ code ] arbeiten kann)
$text=str_replace('<?php','',$text); // wenn <?php vorhanden dann l?schen
$text=str_replace('?>','',$text); // wenn ?> vorhanden dann l?schen
$text=str_replace('<br />','',$text); // formatierte Zeilenumbr?che l?schen (bleiben aber dennoch erhalten)
$text='<?'.$text.'?>'; // <? davor und ?> dahinter setzen
ob_start(); // Puffer starten
highlight_string($text); // php-eigene-Funktion highlight_string() aufrufen
$text=ob_get_contents(); // Puffer auslesen
ob_end_clean(); //Puffer leeren
return $text; // zur?ckgeben
}
-
Danke. Ich werde das gleich Testen mit dem CALLBACK!
edit: funktioniert bestens. Danke f?r deine Hilfe!
Das Puffern betrifft aber nur die Funktion highlight _string.
Du kannst dein Codeschnipsel vereinfachen:
$text = highlight_string($string,1);
Dann brauchst du nicht mehr zu "puffern".
Beitrag ge?ndert am 16.04.2006 12:57 von tuvalu -
Nee, so einfach ist es leider nicht. Sobald man den Text mit htmlentities() "behandelt" hat und ihn z.B. noch in ne Datenbank schreibt, kommt nur noch M?ll raus, wenn man nur highlight_string() benutzt, das hab ich schon zur Gen?ge probiert.
Mein Code ist da schon recht gut, auch wenn er z.B. die Zeileneinsch?be missachtet (hat da jemand vll ne Idee?). -
Nee, so einfach ist es leider nicht. Sobald man den Text mit htmlentities() "behandelt" hat und ihn z.B. noch in ne Datenbank schreibt, kommt nur noch M?ll raus, wenn man nur highlight_string() benutzt, das hab ich schon zur Gen?ge probiert.
Dann hast du wohl das Komma und die 1 ?bersehen!
edit: $text = highlight_string($text, 1 );
Beitrag ge?ndert am 17.04.2006 13:21 von tuvalu -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage