Der englische Originaltext stammt vom Smashing Magazine . Übersetzt von Benhuoer . Bitte geben Sie beim Nachdruck die Quelle an.
Reguläre Ausdrücke (Regular Expression, Abk. Regex) sind leistungsstark und können verwendet werden, um die benötigten Informationen in einer großen Zeichenfolge zu finden. Es verwendet herkömmliche Zeichenstrukturausdrücke, um zu funktionieren. Leider sind einfache reguläre Ausdrücke für einige fortgeschrittene Anwendungen nicht leistungsstark genug. Wenn die Filterstruktur komplexer ist, müssen Sie möglicherweise erweiterte reguläre Ausdrücke verwenden.
Dieser Artikel führt Sie in fortgeschrittene Techniken regulärer Ausdrücke ein. Wir haben acht häufig verwendete Konzepte herausgesucht und anhand von Beispielen analysiert. Jedes Beispiel ist eine einfache Schreibweise, um bestimmte komplexe Anforderungen zu erfüllen. Wenn Ihnen das Verständnis der Grundkonzepte der Regularisierung noch fehlt, lesen Sie bitte zuerst diesen Artikel, dieses Tutorial oder den Wiki-Eintrag.
Die reguläre Syntax hier ist für PHP geeignet und mit Perl kompatibel.
1. Gier/Faulheit
Alle regulären Operatoren, die mehrfach qualifiziert werden können, sind gierig. Sie stimmen so weit wie möglich mit der Zielzeichenfolge überein, was bedeutet, dass das Übereinstimmungsergebnis so lang wie möglich ist. Leider ist dieser Ansatz nicht immer das, was wir wollen. Daher fügen wir das Qualifikationsmerkmal „faul“ hinzu, um das Problem zu lösen. Das Hinzufügen von „?“ nach jedem gierigen Operator führt dazu, dass der Ausdruck nur mit der kürzestmöglichen Länge übereinstimmt. Darüber hinaus kann der Modifikator „U“ auch mehrfach qualifizierbare Operatoren lazytisieren. Das Verständnis des Unterschieds zwischen gierig und faul ist die Grundlage für die Verwendung erweiterter regulärer Ausdrücke.
gieriger Betreiber
Der Operator * stimmt null oder mehrmals mit dem vorherigen Ausdruck überein. Es ist ein gieriger Betreiber. Bitte sehen Sie sich das folgende Beispiel an:
preg_match( '/<h1>.*< /h1>/', '</h1><h1>Dies ist ein Titel.</h1>
<h1>Das ist noch einer. </h1>', $matches );
Der Punkt (.) kann jedes Zeichen außer Zeilenumbrüchen darstellen. Der obige reguläre Ausdruck stimmt mit dem h1-Tag und allem darin überein. Es verwendet Punkte (.) und Sternchen (*), um alles innerhalb des Tags abzugleichen. Die Matching-Ergebnisse lauten wie folgt:
<h1>Dies ist ein Titel. </h1>
<h1>Das ist noch einer. </h1>
Der gesamte String wird zurückgegeben. Der *-Operator stimmt mit allem in einer Zeile überein – sogar mit dem schließenden h1-Tag in der Mitte. Da es gierig ist, entspricht das Abgleichen der gesamten Zeichenfolge seinem Prinzip der Interessenmaximierung.
fauler Betreiber
Modifizieren Sie die obige Formel leicht und fügen Sie ein Fragezeichen (?) hinzu, um den Ausdruck lazy zu machen:
/<h1>.*?< /h1>/</h1>
Auf diese Weise entsteht das Gefühl, dass nur das erste h1-End-Tag übereinstimmen muss, um die Aufgabe abzuschließen.
Ein weiterer gieriger Operator mit ähnlichen Eigenschaften ist {n,}. Das bedeutet, dass das vorherige passende Muster n-mal oder öfter wiederholt wird. Wenn kein Fragezeichen hinzugefügt wird, wird nach so vielen Wiederholungen wie möglich gesucht. Wenn es hinzugefügt wird, wird es so wenig wie möglich wiederholt (natürlich „wiederholen“) n-mal“ ist das Minimum).
#Zeichenfolge erstellen
$str = 'hihihi ups hallo';
# Verwenden Sie für den Abgleich den gierigen {n,}-Operator
preg_match( '/(hi){2,}/', $str, $matches ); # Übereinstimmungen[0] werden 'hihihi' sein;
# Verwenden Sie zum Abgleich den herabgesetzten {n,}?-Operator
preg_match( '/(hi){2,}?/', $str, $matches ); # Übereinstimmungen[0] werden 'hihi' sein;
Quelle: dumme Arbeit