Matze: wie funktioniert eine Callback-Funktion?

Beitrag lesen

Hey!

... Du möchtest nun sicher nicht, dass jemand <script> und anderes Zeug eingibt und damit deine Seite nach Belieben umgestaltet werden kann. Deswegen müssen alle Zeichen mit Sonderbedeutung in HTML in ihrer maskierten Form notiert werden => htmlspecialchars().
Beim Ersetzen verwendest du bereits HTML-Code, in den du die Suchbruchstücke einbettest. Zu diesem Zeitpunkt muss schon syntaktisch korektes HTML entstehen, weil du später nicht mehr unterscheiden kannst, ob ein < zu einem von dir gewollten Tag-Beginn gehört oder vom Anwender eingegeben wurde.

Ich schreibe die Ausgabe im Moment so:

echo meineFunktion(nl2br(htmlspecialchars($_POST['input'])));

Wie die Funktion aussieht habe ich oben bereits gepostet.
Eigentlich hab ich doch dabei keine Probleme die HTML-eigenen Tags vom BB-Code zu trennen?!
htmlspecialchars greift ja vor der Funktion zum suchen & ersetzen.

Ja, und genau das ist ja nicht sehr sinnvoll. Du ermittelst erst alle Muster, wirfst sie in einen Topf (eine gemeinsame Callback-Funktion) und musst sie dann wieder erst voneinander unterscheiden, also mehr oder weniger nochmal neu erkennen. Dann lieber eine Einzelbearbeitung.

Genau dieses "doppelt-gemoppelte" kam mir halt auch sehr merkwürdig vor.

Ja, natürlich. Die Syntax vom a-Element unterscheidet sich vom img-Element und das wiederum vom usw.-Element. Einige sind gleich (zum Beispiel b, u, i), für die kannst du eine gemeinsame Funktion erstellen (der dann über eine dritte RegExp-Gruppe mitgeteilt werden sollte, welches der Elemente vorliegt, um das richtige HTML-Element in die Ausgabe zu bringen).

Also müsste ich so vorgehen?

  
echo meineFunktion(nl2br(htmlspecialchars($_POST['input'])));  
function meineFunktion($string){  
    // für Links  
    $result = preg_replace_callback(REGEXP, 'anchor', $string);  
    // für i, u, b  
    $result = preg_replace_callback(REGEXP, 'iub', $string);  
    // für images  
    $result = preg_replace_callback(REGEXP, 'images', $string);  
}  
function anchor($array){  
    return sprintf('<a href="%s">%s</a>', $array[1], $array[2]);  
}  
function iub($array){  
    // hier müsste ich jetzt wohl irgendwie prüfen ob i, u oder b  
}  
function images($array){  
    return sprintf('<img src="%s" alt="%s" />', $array[1], $array[2]);  
}  

Ich hab gerade gemerkt, dass deine RegExp anders aussieht als meine.
Deine:
'#\[url=([^]]*)]([^[]*)\[/url]#'
Meine:
"#\[link=(.*?)\](.*?)\[/link\]#si"

Da ich nicht so fit damit bin und meine RegExp immer mit mehr Glück als Verstand zusammen schustere würde ich gern wissen wo da jetzt genau die Unterschiede liegen. Ich geh davon aus, dass deine die 'bessere' ist.

Danke und Grüße, Matze