Heim  >  Artikel  >  Backend-Entwicklung  >  php – PCRE-Annotation für reguläre Ausdrücke und rekursiver Modus

php – PCRE-Annotation für reguläre Ausdrücke und rekursiver Modus

伊谢尔伦
伊谢尔伦Original
2016-11-21 17:10:401211Durchsuche

Kommentar

Zeichenfolge (?#-Tag) beginnt mit einem Kommentar, bis eine schließende Klammer gefunden wird. Verschachtelte Klammern sind nicht zulässig. Zeichen in Kommentaren werden nicht als Teil des Musters abgeglichen.

Wenn die Option PCRE_EXTENDED festgelegt ist, zeigt ein nicht maskiertes #-Zeichen außerhalb einer Zeichenklasse an, dass der Rest der Zeile ein Kommentar ist.

Der rekursive Modus

berücksichtigt übereinstimmende Zeichen in Klammern. Das Problem bei Zeichenfolgen besteht darin, eine unendliche Verschachtelung von Klammern zu ermöglichen. Wenn Sie keine Rekursion verwenden, ist die Verwendung eines Mustervergleichs mit fester Verschachtelungstiefe in Perl 5.6 eine experimentelle Funktion, die eine regelmäßige Verschachtelung ermöglicht. Das spezielle Element (?R) bietet diese spezielle Verwendung der Rekursion. Dieser PCRE-Modus löst das Klammerproblem (vorausgesetzt, die Option PCRE_EXTENDED ist gesetzt, sodass Leerzeichen ignoriert werden): ( ( (?>[^ ()] ) | ( ?R) )* ). , Übereinstimmung mit einer schließenden Klammer

Dieses Beispielmuster enthält unendlich wiederholte Verschachtelungen, daher wird eine einmalige Untergruppe verwendet, um Zeichen ohne Klammern abzugleichen, die auf die Zeichenfolge angewendet wird, bei der das Muster nicht übereinstimmt Zum Beispiel, wenn es auf (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ist). und * wiederholen die Qualifizierer, um Zielzeichenfolgen zu trennen, und alle Pfade müssen getestet werden, bevor ein Fehler gemeldet wird.

Der letztendlich für alle Erfassungsuntergruppen festgelegte Wert ist der Wert, der aus dem rekursiven äußersten Mustervergleich erfasst wird (ab(cd)ef) wird die Capture-Untergruppe schließlich auf den Wert „ef“ gesetzt, der der letzte auf der obersten Ebene erhaltene Wert ist ) )* ) ), die erfasste Zeichenfolge ist die Übereinstimmung mit der Klammer der obersten Ebene „ab(cd)ef“. Wenn das Muster mehr als 15 erfassende Klammern enthält, verwendet PCRE während der Rekursion zusätzlichen Speicher die Daten und gibt sie dann über pcre_free frei. Wenn kein Speicher zugewiesen werden kann, werden nur die ersten 15 Capture-Klammern gespeichert und es kann keine Fehlermeldung wegen unzureichendem Speicher innerhalb der Rekursion ausgegeben werden. Ab PHP 4.3.3 (?1) (?2) usw. kann für benannte Untergruppen verwendet werden: (?P>name) oder (?P&name) Wenn die rekursive Untergruppensyntax außerhalb der Untergruppenklammer verwendet wird, auf die sie verweist. entweder eine Untergruppennummer oder ein Untergruppenname), die Operation entspricht einer Unterroutine in einer Programmiersprache. In einem der vorherigen Beispiele heißt es, dass die Muster (sens|respons)e und 1ibility mit „Sinn und Verantwortung“ und „Antwort und Verantwortung“ übereinstimmen, aber nicht mit „Sinn und Verantwortung“. Wenn stattdessen die Muster (sens|respons)e und (?1)ibility verwendet würden, würde es genau wie diese beiden Zeichenfolgen mit „Sinn und Verantwortung“ übereinstimmen. Die Bedeutung dieser Referenzmethode besteht darin, das Untermuster der Referenz sofort abzugleichen. (Anmerkung: Rückwärtsverweise stimmen nur mit den zuvor abgeglichenen Ergebnissen der referenzierten Untergruppe überein. Die rekursive Syntaxreferenz dient hier dazu, das referenzierte Untermuster erneut abzugleichen.)

Die maximale Länge der Zielzeichenfolge ist eine Variable vom Typ int, die sein kann die größte positive ganze Zahl gespeichert. PCRE verwendet jedoch Rekursion, um Untergruppen und unendliche Wiederholungen zu verarbeiten. Dies bedeutet, dass bei einigen Modi der verfügbare Stapelspeicher möglicherweise durch die Zielzeichenfolge begrenzt ist.

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