Da reguläre POSIX-Ausdrücke (ereg) seit PHP 5.3.0 veraltet sind, möchte ich eine einfache Möglichkeit kennen, die alten Ausdrücke in PCRE (Perl Compatible Regular Expressions) (preg) zu konvertieren .
Zum 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 zu Preg und als doppelte Option für verwandte Fragen. Bitte schließen Sie diese Frage nicht.
Verbunden:
php
preg-replace
preg-match
pcre
ereg
Netcoder
quelle
quelle
ereg [php]
liefert nicht sehr nützliche Ergebnisse. OK, kann ich diesem hier meine Unterstützung geben.Antworten:
Die größte Änderung in der Syntax ist das Hinzufügen von Trennzeichen .
Trennzeichen können so ziemlich alles sein, was nicht alphanumerisch, ein Backslash oder ein Leerzeichen ist. Die meisten werden in der Regel
~
,/
und#
.Sie können auch passende Klammern verwenden:
Wenn Ihr Trennzeichen im regulären Ausdruck gefunden wird, müssen Sie ihn umgehen:
Mit preg_quote können Sie problemlos alle Trennzeichen und reservierten Zeichen in einer Zeichenfolge umgehen :
PCRE unterstützt auch Modifikatoren für verschiedene Dinge. Einer der am häufigsten verwendeten ist der Modifikator
i
, bei dem die Groß- und Kleinschreibung nicht berücksichtigt wird , die Alternative zu Eregi :Den vollständigen Verweis auf die PCRE-Syntax in PHP finden Sie im Handbuch sowie eine Liste der Unterschiede zwischen POSIX-Regex und PCRE, um die Konvertierung des Ausdrucks zu erleichtern.
In Ihrem einfachen Beispiel würden Sie jedoch keinen regulären Ausdruck verwenden:
quelle
/^\/hello/
Beispiel tun .(a(b)c)
ist eine vollkommen gültige, abgegrenzte PCRE. Ich persönlich verwende gerne Klammern()
, um mich daran zu erinnern, dass das erste erfasste Match das Ganze ist.error_log
s mit diesen Warnungen voll werden :PHP Deprecated: Function ereg() is deprecated in...
. Argh!Der Ersatz von Ereg durch Preg (ab PHP 5.3.0) war der richtige Schritt zu unseren Gunsten.
preg_match, das eine Perl-kompatible Syntax für reguläre Ausdrücke verwendet, ist häufig eine schnellere Alternative zu ereg.
Sie sollten 4 wichtige Dinge wissen, um Ereg-Muster auf Preg zu portieren:
Trennzeichen hinzufügen (/):
'pattern' => '/pattern/'
Escape-Trennzeichen, wenn es Teil des Musters ist:
'patt/ern' => '/patt\/ern/'
Erreichen Sie es programmgesteuert auf folgende Weise:
$old_pattern = '<div>.+</div>';
$new_pattern = '/' . addcslashes($old_pattern, '/') . '/';
eregi (Matching ohne Berücksichtigung der Groß- und Kleinschreibung):
'pattern' => '/pattern/i'
Wenn Sie also die Eregi-Funktion für das Matching ohne Berücksichtigung der Groß- und Kleinschreibung verwenden, fügen Sie am Ende des neuen Musters ('/ pattern /') einfach 'i' hinzu.ASCII-Werte : Wenn Sie in ereg eine Zahl im Muster verwenden, wird davon ausgegangen, dass Sie sich auf die ASCII eines Zeichens beziehen. In preg wird number jedoch nicht als ASCII-Wert behandelt. Wenn Ihr Muster also einen ASCII-Wert im ereg-Ausdruck enthält (z. B. neue Zeile, Tabulatoren usw.), konvertieren Sie ihn in hexadezimal und stellen Sie ihm \ x voran.
Example: 9(tab) becomes \x9 or alternatively use \t.
quelle
Ab PHP Version 5.3
ereg
ist veraltet.Der Wechsel von
ereg
nachpreg_match
ist nur eine kleine Änderung in unserem Muster.Zuerst müssen Sie Ihrem Code Trennzeichen hinzufügen, z.
zu
Für
eregi
Groß- und Kleinschreibung Matching, setztei
nach dem letzten Trennzeichen, zB:zu
quelle
Es gibt mehr Unterschiede zwischen
ereg()
undpreg_replace()
als nur die Syntax:Rückgabewert:
FALSE
ereg()
kehrt zurückFALSE
,preg_match()
kehrt zurück0
ereg()
gibt String - Länge oder1
,preg_match()
kehrt immer1
Resultierendes Array übereinstimmender Teilzeichenfolgen: Wenn eine Teilzeichenfolge überhaupt nicht gefunden wird (
(b)
in...a(b)?
), wird das entsprechende Element imereg()
Ergebnis angezeigtFALSE
, währendpreg_match()
es überhaupt nicht festgelegt wird.Wenn man nicht mutig genug , um zu konvertieren sein
ereg()
zupreg_match()
, kann er oder sie verwenden mb_ereg () , die in PHP 7 noch verfügbar ist.quelle