Hi!
Deswegen lasse ich mit preg_replace_callback() nur suchen und die Behandlung des Ergebnisses übernimmt die Funktion anchor().
Also doch mit Callback? Jetzt bin ich verwirrt.
'tschuldigung, ich hatte nicht so genau hingesehen, welches Muster du da verwendest. Ja, dafür bietet sich - wenn du es richtig machen willst - die Verwendung einer Callback-Funktion an. Wenn du in deinem Beispiel nur preg_replace() verwendest, hast du eine XSS-Lücke, weil du die HTML-Sonderzeichen nicht behandelst.
Nach deinem Beispiel müsste ich also preg_replace_callback mit jeder RegExp aufrufen? Oder halt in einem Array?
Ein mehrfacher Aufruf, also für jedes Suchmuster einer wäre sinnvoll, denn als Callback kann man nur einen einzelnen angeben. Das heißt, der Callback müsste für alle Suchmuster gleichermaßen umgehen können, wenn du ein Array an Suchmustern verwenden wolltest.
Also einmal für z.B. Links, einmal für Bilder usw. und in der Funktion anchor() wird der String dann bearbeitet?
Ja, für Links. Für Bilder wäre dann eine image()-Funktion angebracht und für usw. eine usw()-Funktion :-)
Wird eigentlich der gesamte String an anchor() geschickt?
Wie immer bei den preg-Funktionen und bei Gruppierungen bekommst du die Gruppenergebnisse in $n (du verwendest \n, besser wäre $n), wobei in n=0 der auf das gesamte Muster passende Teil steht und in n=1..n die Ergebnisse der Gruppen. In der Callback-Funktion stehen dir die Werte als Elemente des übergebenen Arrays zur Verfügung, also gemäß meinem Beispiel wäre der Inhalt von $matched
Array (
[0] => [url=http://example.com/foobar]link & so weiter[/url]
[1] => http://example.com/foobar
[2] => link & so weiter
)
bei einer Übergabe von
foo [url=http://example.com/foobar]link & so weiter[/url] bar
als zu durchsuchender Zeichenfolge. In $matched[0] hast also du die gesamte Fundstelle, nicht aber den gesamten zu durchsuchenen Text.
Ist es aus irgendwelchen Gründen sinnvoller preg_replace_callback und eine Funktion mit vielen sprintf() zu benutzen oder alleine preg_replace mit 2 Arrays (suchen & ersetzen)?
Kommt auf die Aufgabenstellung an. Wenn du nur einfache Ersetzungen benötigst, dann brauchst du keine Callback-Funktion. Sine die Ersetzungsregeln umfangreicher, kommst du an einer spezialisierten Funktion kaum vorbei.
Lo!