Wie kann ich ereg-Ausdrücke in PHP in preg konvertieren?

140

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_matchkompatible 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:

Netcoder
quelle
2
@ yes123: Ja, das ist der Punkt, ich bin es auch leid. Ich möchte einen Wiki-Beitrag, der tatsächlich etwas erklärt, damit wir all diese einzelnen Fragen schließen können.
Netcoder
Ich denke, das ist nicht nötig, weil Sie das Alte nur mit einem Trennzeichen umwickeln müssen. Ich denke auch, dass Sie eine zuvor beantwortete Frage dafür hätten verwenden können.
dynamische
Ah, habe für einen Abschluss gestimmt, bevor ich die Kommentare gelesen habe. Als Platzhalter könnte es einen Zweck erfüllen, aber gibt es nicht eine andere ältere Frage, die als solche hätte dienen können?
Wrikken
Hmm, in der Tat. ereg [php]liefert nicht sehr nützliche Ergebnisse. OK, kann ich diesem hier meine Unterstützung geben.
Wrikken
8
Leute, wir scheinen fast einen Kreis geschlossener Fragen zu diesem Thema geschaffen zu haben, die alle aufeinander hinweisen. Bei dieser Rate werden sie alle geschlossen sein :)
Kev

Antworten:

142

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 meisten werden in der Regel ~, /und #.

Sie können auch passende Klammern verwenden:

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

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

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

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

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

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 :

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

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:

stripos($str, 'hello world') === 0
Netcoder
quelle
2
Wunderbare Erklärung! Ich möchte nur einen Sonderfall hinzufügen, in dem Sie von ereg nach preg_match konvertieren und nur die Trennzeichen und keine reservierten Zeichen maskieren müssen (da sie bereits als Sonderzeichen gearbeitet haben, möchten wir sie nicht maskieren ). : preg_match ('/'. str_replace ('/', '\ /', $ expr). '/', $ str);
Lolito
Es ist besonders erwähnenswert, dass Sie, wenn Sie übereinstimmende Klammern verwenden, keine Zeichen maskieren müssen, "nur weil es mit dem Trennzeichen identisch ist", wie Sie es mit anderen Symbolen wie dem /^\/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.
Niet the Dark Absol
Kann ich sagen, ich hasse PHP! (Nur das. Sonst nichts.) Ich muss diese Antworten suchen, wenn mein freigegebener Webhosting-Server auf eine neue Version aktualisiert wird und die error_logs mit diesen Warnungen voll werden : PHP Deprecated: Function ereg() is deprecated in.... Argh!
c00000fd
Wie konvertiere ich das? $ regex = $ e. '((\. [^ \.'. $ e. '] [^'. $ e. '] *) | (\. \. [^'. $ e. '] +) | ([^ \. ] [^ '. $ e.'] *)) '. $ e. '\. \.' . $ e; zu preg_math funktioniert es am besten, indem man einfach / modifier /
bdalina
32

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:

  1. Trennzeichen hinzufügen (/):'pattern' => '/pattern/'

  2. 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, '/') . '/';

  3. 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.

  4. 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.

Sumoanand
quelle
8

Ab PHP Version 5.3 eregist veraltet.

Der Wechsel von eregnach preg_matchist nur eine kleine Änderung in unserem Muster.

Zuerst müssen Sie Ihrem Code Trennzeichen hinzufügen, z.

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

zu

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

Für eregiGroß- und Kleinschreibung Matching, setzte inach dem letzten Trennzeichen, zB:

eregi('pattern', 'string');

zu

preg_match ('/pattern/i', 'string');
Narayan
quelle
7

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

  • Rückgabewert:

    • Bei Fehler : beide kehren zurückFALSE
    • Bei keiner Übereinstimmung : ereg()kehrt zurück FALSE, preg_match()kehrt zurück0
    • An Spiel : ereg()gibt String - Länge oder 1, preg_match()kehrt immer1
  • Resultierendes Array übereinstimmender Teilzeichenfolgen: Wenn eine Teilzeichenfolge überhaupt nicht gefunden wird ( (b)in ...a(b)?), wird das entsprechende Element im ereg()Ergebnis angezeigt FALSE, während preg_match()es überhaupt nicht festgelegt wird.

Wenn man nicht mutig genug , um zu konvertieren sein ereg()zu preg_match(), kann er oder sie verwenden mb_ereg () , die in PHP 7 noch verfügbar ist.

Roman Hocke
quelle