cybton.com
Über uns | Jobs | Werbung | Sitemap | AGB | Impressum | Hilfe ?
 Kostenlos anmelden)
wichtigWir suchen PHP-Entwickler/innen (Freelancer oder Vollzeit)
Forum
Aktuellste Beiträge
Forenregeln

Community
BB-Codes
Tags
Chat
Suche (Web)
Wer ist online?
Top-User

Basar


Statistik
Mitglieder gesamt: 69394
Mitglieder online: 0
Gäste online: 3
mehr...

Anzeige
Forum » Forum: Website & Webprogrammierung » Thread: preg_replace_callback() escaped automatisch?

Thread: preg_replace_callback() escaped automatisch?


05.01.2009 10:43 Uhr

 

Status: offline
Hallo

Ich wollte gerne auch eine solch nette Funktion auf meiner Homepage einbauen, damit man einen Code posten kann, der gehighlightet wird =)
Für die unter euch, sie sich wundern, warum ich es in meinem Gästebuch mache ... mein Forum läuft noch nicht =)
Hier die Umwandlung des BB-Codes:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
      $guestbook_text = nl2br(htmlentities($guestbook_mysql_array["guestbook_text"]));
      $guestbook_text = preg_replace("#\[br\]#Ui", "<br />", $guestbook_text);
      $guestbook_text = preg_replace("#\[b\]#Ui", "<b>", $guestbook_text);
      $guestbook_text = preg_replace("#\[/b\]#Ui", "</b>", $guestbook_text);
      $guestbook_text = preg_replace("#\[i\]#Ui", "<i>", $guestbook_text);
      $guestbook_text = preg_replace("#\[/i\]#Ui", "</i>", $guestbook_text);
      $guestbook_text = preg_replace("#\[u\]#Ui", "<u>", $guestbook_text);
      $guestbook_text = preg_replace("#\[/u\]#Ui", "</u>", $guestbook_text);
      $guestbook_text = preg_replace("#\\[url=(.*)\\](.*)\\[/url\\]#Ui", "<a href=\"\\1\" target=\"_blank\">\\2</a>", $guestbook_text);
      $guestbook_text = preg_replace("#\\[url\\](.*)\\[/url\\]#Ui", "<a href=\"\\1\" target=\"_blank\">\\1</a>", $guestbook_text);
      $guestbook_text = preg_replace_callback("#\\[code=php\\](.*)\\[/code\\]#Uis", create_function("\$suchergebniss", "return highlight_string(\"<?php \".\$suchergebniss[1].\" ?>\", TRUE);"), $guestbook_text);
?>
Die Smilies habe ich mal rausgenommen -> wäre zu viel Code gewesen - wegen der Übersicht!
Das Ergebnis sieht folgendermaßen aus:
Zitat von Post aus meinem Gästebuch:
<?php <br />
&lt;?php<br />
echo &quot;hallo&quot;;<br />
?&gt;<br />
?>
Ich habe ja mit Absicht bei der Funktion für das Highlighten an den Anfang "<?php" und an das Ende "?>" angefügt, damit ich sehe, ob das Highlighten funktioniert - es tut.
Nur das escapen passt mir nicht ^^
Wie kann ich das umgehen?

Gruß
1 mal bearbeitet
05.01.2009 10:50 Uhr

 

bmk
Moderator
Status: offline
Nochmal, langsam, damit ichs auch verstehe:
Du rufst in der ersten geposteten Zeile htmlentities() auf, und wunderst dich später, warum alles escaped ist...?!?
___________________________
Let's code responsibly...
Webcrawler -- Portal für Dirigenten -- Musikverein Königstetten
06.01.2009 20:21 Uhr

 

Status: offline
Ja ich habe es aber auch schon andersrum versucht - das ging schief.
Es wird dann alles mit <span></span> usw usf ausgegeben.
Oder gibt es da noch eine Reihenfolge?
06.01.2009 21:28 Uhr

 

bmk
Moderator
Status: offline
Zitat:
Ja ich habe es aber auch schon andersrum versucht - das ging schief.
Es wird dann alles mit <span></span> usw usf ausgegeben.

Na klar wird es das - weil du dann alle Spitzklammerndie du durch das Replacen einfügst, escapest!
1 mal bearbeitet
___________________________
Let's code responsibly...
Webcrawler -- Portal für Dirigenten -- Musikverein Königstetten
06.01.2009 22:46 Uhr

 

Status: offline
Das Problem ist nicht preg_replace_callback, denn das escaped von sich aus gar nichts, das Problem liegt daran, dass du mit htmlentities escapesd und dann diesen escapeten String der Funktion highlight_string übergibst welche nun mal von sich aus wieder escaped!
Genau dieser Teil ist schuld:
Zitat:
create_function("\$suchergebniss", "return highlight_string(\"<?php \".\$suchergebniss[1].\" ?>\", TRUE);")

Um das zu korrigieren musst du highlight_string den nicht escapeten String übergeben, das kannst du machen in dem du einfach die Variabel $suchergebniss in dieser zur Laufzeit erzeugten Funktion per html_entity_decode() zurückumwandelst.

Jedoch würde sich dann der Lesbarkeit halber eine externe Funktion einer zur Laufzeit generierten Funktion eher anbieten besonders im nächsten Punkt.

Bei dem Ergebnis dass du von highlight_string zurückbekommst würde ich noch das <?php und ?> wegmachen sonst steht später mehr drin als der User eigentlich eingegeben hat, kannst du entweder mit regulären Ausdrücken oder in dem du schaust was da am Ende rauskommst und die ersten x Zeichen löscht (denn das sollte sich ja nicht ändern) und die letzten y Zeichen eben.

Du könntest natürlich auch das htmlentities nur auf das anwenden was später nicht der Funktion highlight_string vorgesetzt wird. Das könntest du mit regulären Ausdrücken erreichen (gerade wieder mit preg_replace_callback) aber da habe ich gerade keine Lust einen entsprechenden Ausdruck oder Code zu erstellen.

Ich finde die Lösung mit highlight_string sowieso eher suboptimal du könntest ggf. deinen eigenen Syntax-Highlighter bastellen das ist zwar etwas mehr Aufwand bringt dir aber einige Vorteile: kein zusätzliches einfügen von <?php und ?> nötig, ggf. kein entfernen dieser oder dem eingefügt lassen von Dingen die der User gar nicht eingegeben hat, Nutzung von Klassen und CSS (leichte Anpassbarkeit des Aussehens per CSS), leichte Erweiterbarkeit auf andere Sprachen (kann die Funktion überhaupt HTML, CSS oder andere highlighten?), keine Probleme mit dem escapen, genau das richtige um reguläre Ausdrücke zu erlernen (was du ja gerade vor hast), ...

Wenn du das nicht selber machen kannst oder willst, kannst du auch schauen ob es sowas ggf. zur freien Verwendung bereits gibt und das nutze. Selbst in den Kommentaren auf dieser Seite http://de2.php.net/manual/de/function.highlight-string.php gibt es einiges, ob da was dabei ist was man gebrauchen kann weis ich jedoch nicht.
Ähnliche Threads Forum Ähnlichkeitsgrad
 PHP, Pfad wird nicht richtig erzeugt Website & Webprogrammierung 1
 [gelöst]Automatisches Anmelder bei Windows Software & Betriebssysteme 1
 Batch Datei von USB-Stick automatisch ausführen Software & Betriebssysteme 1
 Bild automatisch alle x pixel zerschneiden Grafik, Fotobearbeitung, 3D-Modeling, Artwork 1
 FTp-Programm Software & Betriebssysteme 1
 In Excel neue Seiten erstellen Software & Betriebssysteme 1
 Schnipselbilder Programm machen ? Grafik, Fotobearbeitung, 3D-Modeling, Artwork 1
nach obennach oben

Copyright © 2014 cybton-network

Google
Partner: #Musik - Dein Internetradio - nexem. - .wir machen news
ANEXIA - PHP Entwicklung - Web-Entwicklung - Fritz!Box Anrufmonitor für Mac OS - Rolladen, Markisen und Jalousien in Stuttgart - Rolladen in Stuttgart - SMSjobs