Wie kann ich ereg Ausdrücke in PHP umwandeln?

Da reguläre POSIX-Ausdrücke (ereg) seit PHP 5.3.0 veraltet sind, würde ich gerne eine einfache Möglichkeit kennen, die alten Ausdrücke in PCRE (Perl Compatible Regular Expressions) umzuwandeln (preg) .

Pro Beispiel habe ich diesen regulären Ausdruck:

eregi('^hello world'); 

Wie kann ich Ausdrücke in preg_match kompatible Ausdrücke übersetzen?

Hinweis: Dieser Beitrag dient als Platzhalter für alle Beiträge im Zusammenhang mit der Konvertierung von ereg in preg und als duplizierte Optionen für verwandte Fragen. Bitte schließen Sie diese Frage nicht.

Verbunden:

  • Wie man PHP’s Eregi zu preg_match ändert
  • Ändern von ereg_replace zu äquivalentem preg_replace

   

Die größte Änderung in der Syntax ist das Hinzufügen von Trennzeichen .

 ereg('^hello', $str); preg_match('/^hello/', $str); 

Trennzeichen können so ziemlich alles sein, was nicht alphanumerisch, ein Backslash oder ein Leerzeichen ist. Die am häufigsten verwendeten sind ~ , / und # .

Sie können auch passende Klammern verwenden:

 preg_match('[^hello]', $str); preg_match('(^hello)', $str); preg_match('{^hello}', $str); // etc 

Wenn Ihr Begrenzer im regulären Ausdruck gefunden wird, müssen Sie ihn umgehen:

 ereg('^/hello', $str); preg_match('/^\/hello/', $str); 

Mit preg_quote können Sie einfach alle Trennzeichen und reservierten Zeichen in einer Zeichenfolge umgehen :

 $expr = preg_quote('/hello', '/'); preg_match('/^'.$expr.'/', $str); 

Außerdem unterstützt PCRE Modifikatoren für verschiedene Dinge. Einer der am häufigsten verwendeten ist der Modifizierer case-insensitive, die Alternative zu eregi :

 eregi('^hello', 'HELLO'); preg_match('/^hello/i', 'HELLO'); 

Sie finden den vollständigen Verweis auf die PCRE-Syntax in PHP im Handbuch sowie eine Liste der Unterschiede zwischen POSIX regex und PCRE, um die Konvertierung des Ausdrucks zu unterstützen.

In Ihrem einfachen Beispiel würden Sie jedoch keinen regulären Ausdruck verwenden:

 stripos($str, 'hello world') === 0 

Ereg Replacement mit Preg (ab PHP 5.3.0) war richtig bewegen zu unseren Gunsten.

preg_match, das eine Perl-kompatible Syntax für reguläre Ausdrücke verwendet, ist oft eine schnellere Alternative zu ereg.

Sie sollten 4 wichtige Dinge kennen, um EREG-Muster in preg zu portieren:

  1. Fügen Sie Trennzeichen (/) hinzu: 'pattern' => '/pattern/'

  2. Escape delimiter wenn es ein Teil des Musters ist: 'patt/ern' => '/patt\/ern/'
    Erreichen Sie es programmatisch auf folgende Weise:
    $old_pattern = '

    .+

    ';
    $new_pattern = '/' . addcslashes($old_pattern, '/') . '/';

  3. eregi (case-insensitive matching): 'pattern' => '/pattern/i' Also, wenn Sie die eregi-function für case insentive verwenden, fügen Sie einfach ‘i’ am Ende des neuen Musters hinzu (‘/ pattern /’) .

  4. ASCII-Werte : Wenn Sie in ereg Zahlen im Muster verwenden, wird angenommen, dass Sie sich auf das ASCII eines Zeichens beziehen. Aber in preg wird Nummer nicht als ASCII-Wert behandelt. Wenn Ihr Muster also einen ASCII-Wert im ereg-Ausdruck enthält (zum Beispiel: neue Zeile, Tabulatoren usw.), dann wandeln Sie es in hexadezimal um und setzen Sie es mit \ x voran.
    Example: 9(tab) becomes \x9 or alternatively use \t.

Es gibt mehr Unterschiede zwischen ereg() und preg_replace() als nur die Syntax:

  • Rückgabewert:

    • Bei Fehler : beide geben FALSE
    • Bei keiner Übereinstimmung : ereg() gibt FALSE , preg_match() gibt 0
    • Bei Übereinstimmung : ereg() gibt Stringlänge oder 1 , preg_match() gibt immer 1
  • Resultierendes Array von übereinstimmenden Teilstrings: Wenn überhaupt kein Teilstring gefunden wird ( (b) in ...a(b)? ), ereg() entsprechende Element in ereg() Ergebnis FALSE , während es in preg_match() nicht gesetzt ist überhaupt.

Wenn man nicht mutig genug ist, sein ereg() in preg_match() , kann er mb_ereg () verwenden , was in PHP 7 noch verfügbar ist.

Ab PHP Version 5.3 ist ereg veraltet.

Der Wechsel von ereg zu preg_match ist nur eine kleine Änderung in unserem Muster.

Zuerst müssen Sie Ihrem Code Trennzeichen hinzufügen, zB:

 ereg('A-Z0-9a-z', 'string'); 

zu

 preg_match('/A-Z0-9a-z/', 'string'); 

Bei der eregi / Kleinschreibung ohne eregi Groß- und Kleinschreibung, setze i nach dem letzten Trennzeichen, zB:

 eregi('pattern', 'string'); 

zu

 preg_match ('/pattern/i', 'string');