Rolf B: u Modifier in einem PHP regEx Ausdruck

Beitrag lesen

Hallo Verzweifelnder,

*kau*, *schluck* - bah, widerlich, eigene Worte zu verzehren...

Meine Annahme, dass es wohl Quatsch sei, in der Laufzeitumgebung einer Sprache verschiedene Regex-Engines zu haben, war wohl nicht mit der Kreativität der Lerdorfschen Mannen (und Frauen) vereinbar.

Die mb_regex_set_options Funktion verrät, dass die mb-Funktionen gleich 8 Syntax-Alternativen im Angebot haben. Ich würde annehmen, dass da ein "Compiler" dahinter liegt, der das auf ein einheitliches internes Format überträgt und dieses dann von einer gemeinsamen Engine ausgeführt wird. Welche Syntaxvarianten möglich sind, steht hier.

Bei mir liefert mb_regex_set_options() den Wert "pr", d.h. die mb-Funktionen verwenden per Default die Ruby-Syntax. Und die soll im Wesentlichen PCRE-kompatibel sein. Die genaue Syntax hängt vermutlich von der verwendeten oniguruma Library ab. Welche Du hast, verrät Dir phpinfo() - in meinem PHP 8.1.4 für Windos ist es

Multibyte regex (oniguruma) version	6.9.7

Oniguruma ist eine Regex-Library, die bis PHP 7.3 mit PHP ausgeliefert wurde. Seit 7.4 wird erwartet, dass sie auf dem Server vorinstalliert ist. Sagt das Handbuch.

Das ändert nichts an der mistigen Tatsache, dass php.net sich um eine Doku der mb-Regex-Funktionen herumdrückt und einfach vorauszusetzen scheint, dass man das alles weiß.

Die preg_... Funktionen scheinen dagegen eine "normale" PCRE-Library zu verwenden. Mein phpinfo() sagt:

PCRE Library Version	10.39 2021-10-29
PCRE Unicode Version	14.0.0

Der Hauptunterschied zwischen PCRE- und Oniguruma-Library ist, dass PCRE die Optionen im Patternstring erwartet und Oniguruma dafür eine eigene Funktion hat, die in PHP als mb_regex_set_options angeboten wird. Deswegen bekommen die PCRE-Funktionen die Regex-Delimiter im Pattern, und die mb_-Funktionen nicht. Die Option "u" ist für die mb-Funktionen ohnehin nicht nötig.

Also: preg_match("/[a-z]/u", $foo) entspricht mb_ereg("[a-z]", $foo).

Welche der beiden Libs bei komplexen Regexen und/oder viel Text performanter ist, weiß ich nicht.

Dein Pattern [a-z] matcht übrigens nicht den ganzen String, sondern nur einen Kleinbuchstaben daraus. Aber das weißt Du vermutlich selbst…

Rolf

--
sumpsi - posui - obstruxi