Hi!
$string = preg_replace_callback($arrneedle, preg_replace($arrneedle, $arrreplace, $string), $string);[/code]
Das gibt mir folgenden Fehler:
Warning: preg_replace_callback() [function.preg-replace-callback]: Requires argument 2, '<a href="\1">\2</a>::<b>\1</b>', to be a valid callback in...Wieso ist das so?
Ich dachte mit jeder gefundenen Zeichenkette wird damit preg_replace aufgerufen und der Teil ersetzt.
Das was du machst ist quasi wie folgt:
foo(bar())
Solche verschachtelte Funktionsaufrufe werden immer von innen nach außen aufgelöst. Also wird zuerst bar() aufgerufen - was auch immer es macht - und das zurückgegebenen Ergebnis davon wird als Argument von foo() verwendet. Es ist _nicht_ so, dass foo() aufgerufen wird und das dann bar() aufruft. - Das jedenfalls ist kein Callback.
preg_replace_callback() erwartet als zweiten Parameter die Angabe einer Callback-Funktion, was im einfachsten Fall der Name einer Funktion ist, der als String übergeben wird. Im foo-bar-Beispiel müsste also bar() einen String mit einem Funktionsnamen liefern. Wenn bar() selbst die Callback-Funktion sein soll, wäre foo("bar") ein gültiger Aufruf oder aber auch foo(qux()), mit function qux() { return "bar"; }.
Das willst du aber gar nicht so verwenden. Allerdings sehe ich anhand deines Beispiels nicht, warum du einen Callback benötigst und nicht einfach nur preg_replace() aufrufen willst.
Ein Beispiel für eine Callback-Anwendung wäre:
function anchor($matched) {
return sprintf('<a href="%s">%s</a>', htmlspecialchars($matched[1]), htmlspecialchars($matched[2]));
}
$result = preg_replace_callback('#\[url=([^]]*)]([^[]*)\[/url]#', 'anchor', $text);
Das was statt [url=...]...[/url] eingesetzt werden soll, lässt sich nur recht umständlich als RegExp formulieren, wenn man die HTML-Sonderzeichen mit berücksichtigen will (das was htmlspecialchars() macht). Deswegen lasse ich mit preg_replace_callback() nur suchen und die Behandlung des Ergebnisses übernimmt die Funktion anchor(). In ihr könnte nun beispielsweise auch noch eine unterschiedliche Behandlung von URLs implementiert werden, die mit http:// oder ftp:// oder ohne oder sonstwie angegeben wurden. All dies als einen einzigen RegExp zu formulieren, dürfte auch nicht gerade übersichtlich werden.
Lo!