preg_replace mit Funktion ersetzen
Dass man mit preg_replace Reguläre Ausdrücke durch Strings ersetzen kann, habe ich wohl gewusst; dass man mit dem “/e“-Schalter auch statt des Strings eine Funktion mit einem oder mehreren Referenzen auf das Suchmuster angeben kann, habe ich leider erst vor kurzem herausgefunden.
Bisher habe ich solche Dinge immer mit preg_match(_all) und einer anschließenden Schleife gelöst. Allerdings ist preg_replace(mit “/e“) in einfachen Dingen (zumindest laut Xdebug) einiges schneller und auch weniger Tipparbeit.
Beispiel (Html-Tags und Attributnamen klein geschrieben, die Attribute jedoch nicht):
$str = '<P>Das ist EIN</P><P STYLE="text-align:center" Alt="Test">TEST</P>';
$regexAttributes = '/([a-zA-Z]+=)/e';
$regexTags = '/(<\/?[a-zA-Z]+)/e';
$str = preg_replace($regexAttributes, "strtolower('\\1')", $str);
$str = preg_replace($regexTags, "strtolower('\\1')", $str);
Vielleicht würde das auch in einem einzigen Regex gehen, aber Reguläre Ausdrücke waren noch nie mein Ding – ebensowenig wie Rosinen oder Rosenkohl (man erkennt ein eindeutiges „R“-Muster).
Hat man mehrere Teilmuster, so kann man diese einfach hintereinanderschreiben:
$str = preg_replace($regex, "funktion('\\1\\2')", $str);
//Oder mit mehreren Funktionen
$str = preg_replace($regex, "funktion1('\\1').funktion2('\\2')", $str);
//die Referenzierung ist auch ohne Funktion möglich
$str = preg_replace($regex, "funktion('\\1').'\\2'", $str);
Bei einfachen Funktionen kann man sich mit dem “\e“ hinter dem Regex doch vielleicht die eine oder andere Schleife sparen.
Danke, genau das hab ich gesucht. Steht sogar im PHP Handbuch, aber da hab ichs irgendwie nicht gefunden ;-)