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;
}

  

<< zurück vor >>

 

 

 

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