Warum gibt dieser reguläre PHP-Ausdruck preg_match manchmal false zurück?

WBOY
Freigeben: 2016-09-19 09:16:24
Original
1156 Leute haben es durchsucht

Wie im Titel:

<code class="php">echo var_dump(preg_match('/^(([a-zA-Z0-9]+\-?)+[a-zA-Z0-9]+\.)+[a-zA-Z]+$/i','lo-n.l-on.loh-4va.ccccc5om'));//return 0
echo var_dump(preg_match('/^(([a-zA-Z0-9]+\-?)+[a-zA-Z0-9]+\.)+[a-zA-Z]+$/i','lo-n.l-on.loh-4va.cccccom'));//return 1
echo var_dump(preg_match('/^(([a-zA-Z0-9]+\-?)+[a-zA-Z0-9]+\.)+[a-zA-Z]+$/i','lon.lon.lon.loh4va.cccc5com'));//return false
echo var_dump(preg_match('/^(([a-zA-Z0-9]+\-?)+[a-zA-Z0-9]+\.)+[a-zA-Z]+$/i','lon.lon.lon.loh4va.cccccom'));//return 1</code>
Nach dem Login kopieren
Nach dem Login kopieren

Antwortinhalt:

Wie im Titel:

<code class="php">echo var_dump(preg_match('/^(([a-zA-Z0-9]+\-?)+[a-zA-Z0-9]+\.)+[a-zA-Z]+$/i','lo-n.l-on.loh-4va.ccccc5om'));//return 0
echo var_dump(preg_match('/^(([a-zA-Z0-9]+\-?)+[a-zA-Z0-9]+\.)+[a-zA-Z]+$/i','lo-n.l-on.loh-4va.cccccom'));//return 1
echo var_dump(preg_match('/^(([a-zA-Z0-9]+\-?)+[a-zA-Z0-9]+\.)+[a-zA-Z]+$/i','lon.lon.lon.loh4va.cccc5com'));//return false
echo var_dump(preg_match('/^(([a-zA-Z0-9]+\-?)+[a-zA-Z0-9]+\.)+[a-zA-Z]+$/i','lon.lon.lon.loh4va.cccccom'));//return 1</code>
Nach dem Login kopieren
Nach dem Login kopieren

Sehen Sie sich den Code an, den Sie gerade filtern. int(0) bedeutet, dass es keine Übereinstimmung gibt, int(1) bedeutet, dass die Übereinstimmung erfolgreich ist.

Lassen Sie mich Ihnen beim Ändern des Codes helfen. Die Gruppenerfassung kann nicht wahllos verwendet werden, das regelmäßige Schreiben muss prägnant sein und die Betriebseffizienz muss so weit wie möglich verbessert werden, und unnötige Variablen dürfen nicht gespeichert werden. Sie müssen das Backtracking-Prinzip der regulären Engine verstehen, um zu verstehen, was Sie tun.

Für mehr Grundwissen müssen Sie zumindest den Unterschied in den Matching-Prinzipien und der Betriebseffizienz zwischen Greedy-Matching und Non-Greedy-Matching verstehen.

Original:

<code>preg_match('/^(([a-zA-Z0-9]+\-?)+[a-zA-Z0-9]+\.)+[a-zA-Z]+$/i','lo-n.l-on.loh-4va.ccccc5om');</code>
Nach dem Login kopieren

Ändern:

<code>preg_match('/^(?:(?:\w+\.?\w+)-?){4}$/', 'lo-n.l-on.loh-4va.ccccc5om'); </code>
Nach dem Login kopieren

Ich werde es anhand der jeweiligen Frage analysieren.

Nehmen Sie den ersten Codeabschnitt in der Frage als Beispiel:

<code>preg_match('/^(([a-zA-Z0-9]+\-?)+[a-zA-Z0-9]+\.)+[a-zA-Z]+$/i','lo-n.l-on.loh-4va.ccccc5om')</code>
Nach dem Login kopieren

Warum gibt dieser reguläre PHP-Ausdruck preg_match manchmal false zurück?

Es waren insgesamt 74781 Schritte erforderlich, mehr als 70.000 Schritte!
Geändert zu dem, den ich oben geändert habe

<code>preg_match('/^(?:(?:\w+\.?\w+)-?){4}$/', 'lo-n.l-on.loh-4va.ccccc5om');</code>
Nach dem Login kopieren

Nachher:

Warum gibt dieser reguläre PHP-Ausdruck preg_match manchmal false zurück?

Nur ​​34 Schritte erforderlich.

Analysieren Sie den Matching-Prozess.
Der Betreff der Frage:

Warum gibt dieser reguläre PHP-Ausdruck preg_match manchmal false zurück?

Geänderte Matching-Schritte:

Warum gibt dieser reguläre PHP-Ausdruck preg_match manchmal false zurück?

74781 Schritte: 34 Schritte entsprechen ungefähr 2200 %. Die Effizienz ist wirklich unterschiedlich.

----Hinzugefügt am 29. Dezember ---
Über regelmäßiges Lernen:
Ich habe es im Detail beim Lernen von Perl studiert. Persönlich denke ich, dass die folgenden Punkte befolgt werden müssen, um reguläre Ausdrücke sinnvoll zu nutzen:
1 Unterscheiden Sie, wann Sie Greedy Matching und Non-Greedy Matching verwenden sollten
2 Versuchen Sie, Anker zu verwenden
3 Versuchen Sie, was zu gruppieren kann gruppiert werden
4 Metazeichen Anstatt aufzuzählen, ist es besser, den Filter umzukehren und zusammenzufassen. Beispielsweise ist [a-zA-Z0-9] nicht so gut wie w als 1. Wenn Sie den Anker hinzufügen (b Ankerwörter,?= ?>, ?!Vorwärts- und Rückwärtssuche), wird die sogenannte Quantifiziererverschachtelung beschleunigt sollte nicht verwendet werden (* sollte so wenig wie möglich verwendet werden, was die Anzahl der Backtracks, also die Anzahl der Backtracks, erheblich reduzieren kann.
Für ein rationaleres Verständnis möchte ich das Männchen unter 1 Milliarde Menschen finden Sagen Sie mir einfach das offensichtlichste und ein paar Merkmale, wie zum Beispiel diese beiden. Es ist nicht nötig, mir 100 Merkmale zu nennen und mich zu bitten, sie einzeln zu überprüfen.

Oben.


    -s ↩

http://php.net/manual/zh/func...

preg_match() gibt die Anzahl der Übereinstimmungen für Muster zurück. Sein Wert ist 0 (keine Übereinstimmung) oder 1, da preg_match() die Suche nach der ersten Übereinstimmung beendet. Der Unterschied zu preg_match_all() besteht darin, dass das Subjekt bis zum Ende gesucht wird. Wenn ein Fehler auftritt, gibt preg_match() FALSE zurück.

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage