Ein Pattern-Argument auf korrekte Syntax prüfen
(Auszug aus "Reguläre Ausdrücke" von Jeffrey E. F. Friedl)
Nachdem wir den Regex-String sauber maskiert und in Begrenzungszeichen eingepackt haben, wissen wir leider immer noch nicht, ob die ursprüngliche Regex syntaktisch korrekt geschrieben ist.
Zum Beispiel könnte der Regex-String ›*.txt‹ lauten – weil jemand eine Datei-Wildcard statt einer Regex eingegeben hat. Das Resultat von preg_regex_to_pattern ist /*.txt/, aber das enthält keinen gültigen regulären Ausdruck und erzeugt die Fehlermeldung (sofern die PHP-Warnungen aktiviert sind):
Compilation failed: nothing to repeat at offset 0
PHP enthält keine Funktion, mit der man eine Regex auf syntaktische Korrektheit prüfen kann; deshalb habe ich eine geschrieben.
Die Funktion preg_pattern_error prüft das Pattern-Argument durch schlichtes Ausprobieren – auf der hervorgehobenen Zeile mit preg_match in der Mitte. Im Rest der Funktion geht es darum, die PHP-Fehlermeldungen abzufangen, die dabei eventuell generiert werden.
/*
* preg_pattern_error gibt bei einem ungültigen Pattern-Argument oder einer syntaktisch
* ungültigen Regex eine Fehlermeldung zurück. Im anderen Fall (wohlgeformtes Pattern-
* Argument und Regex) wird false zurückgegeben.
*/
function preg_pattern_error($pattern)
{
/*
* Wir überprüfen das Pattern einfach dadurch, indem wir es ausprobieren.
* Das Erkennen und Abfangen einer Fehlermeldung ist nicht so einfach, besonders, weil wir
* natürlich keine globalen Einstellungen (z.B. den Wert von $php_errormsg) verändern wollen.
* Wenn 'track_errors' aktiviert ist, speichern wir den Wert von $php_errormsg ab und
* holen ihn nachher zurück. Wenn die Option 'track_errors' nicht gesetzt ist, setzen
* wir sie (weil wir diese Option benötigen) und schalten sie am Ende wieder aus.
*/
if ($old_track = ini_get("track_errors"))
$old_message = isset($php_errormsg) ? $php_errormsg : false;
else
ini_set('track_errors', 1);
/* Die Option 'track_errors' ist jetzt sicher eingeschaltet. */
unset($php_errormsg);
@ preg_match($pattern, ""); /* Ausprobieren! */
$return_value = isset($php_errormsg) ? $php_errormsg : false;
/* Fehlermeldung abgefangen und gespeichert -- vorherigen Zustand wiederherstellen. */
if ($old_track)
$php_errormsg = isset($old_message) ? $old_message : false;
else
ini_set('track_errors', 0);
return $return_value;
}
Tipp der data2type-Redaktion: Zum Thema Reguläre Ausdrücke bieten wir auch folgende Schulungen zur Vertiefung und professionellen Fortbildung an: |
Copyright der deutschen Ausgabe © 2008 by O’Reilly Verlag GmbH & Co. KG
Für Ihren privaten Gebrauch dürfen Sie die Online-Version ausdrucken.
Ansonsten unterliegt dieses Kapitel aus dem Buch "Reguläre Ausdrücke" denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.
O’Reilly Verlag GmbH & Co. KG, Balthasarstr. 81, 50670 Köln