Featured

Einige Artikel, den Sie beachten sollten ....

Google Reader

Ich teile einige Artikel in Google Reader. Sie sind sehr wichtig für mich.

Überschrift

Die wichtigsten Artikel ~

Normal

原创

通常 原创 都是 短短 的 因为 站长 很忙.

Home » Normal

Crucial Konzepte hinter Advanced Regular Expressions

Verfasst von Tung am 17. Juni 2010 - 02.14 Uhr Kein Kommentar
Crucial Konzepte hinter Advanced Regular Expressions

Reguläre Ausdrücke (oder reguläre Ausdrücke) sind ein guter Weg zu durchqueren große Strings, um Informationen zu finden. Sie berufen sich auf zugrunde liegende Muster in einem String-Struktur, um ihre Magie zu arbeiten. Leider sind einfache reguläre Ausdrücke nicht mit komplexen Mustern und Symbolen umzugehen. Um mit diesem Dilemma, können Sie die erweiterten regulären Ausdrücken.

Nachfolgend präsentieren wir Ihnen eine Einführung in fortgeschrittene reguläre Ausdrücke, mit acht häufigsten verwendeten Konzepte und Beispiele. Jedes Beispiel zeigt eine einfache Möglichkeit, komplexe Muster in Zeichenketten übereinstimmen. Sollten Sie noch keine Erfahrung mit regulären Ausdrücken, einen Blick auf diesen Artikel , um loszulegen. Die Syntax von PHP's hier passt Perl-kompatible reguläre Ausdrücke.

[By the way, wussten Sie, wir haben eine brandneue freie Smashing Email Newsletter ? Abonnieren Sie jetzt und holen Sie kurze Tipps und Tricks am Dienstag!]

1. Gier / Faulheit

Greed in entscheidenden Konzepte hinter Advanced Regular Expressions

Alle regex Wiederholung Betreiber sind gierig. Sie versuchen so viel wie möglich in einer Zeichenfolge entspricht. Leider ist dies vielleicht nicht immer den gewünschten Effekt. So sind faul Reiseveranstaltern genutzt, um dieses Problem zu lösen. Sie passen nur die kleinste mögliche Muster und werden verwendet, indem ein "?" nach dem jeweiligen Betreiber gierig. Alternativ kann das 'U' Modifier kann verwendet werden, um allen Betreibern repetiton faul sein. Die Unterscheidung zwischen Gier und Faulheit ist der Schlüssel zum Verständnis voll Erweiterte reguläre Ausdrücke.

Gierig Operatoren

Der Operator * entspricht dem vorherigen Ausdruck 0 oder mehrmals. Es ist ein gieriger Betreiber. Betrachten Sie den folgenden Ausdruck:

  preg_match ('/ <h1> .* <\ / h1> /', '<h1> Das ist eine Überschrift. </ h1> <h1> Dies ist eine andere. </ h1>', $ treffer); 

Erinnern, dass ein. bedeutet ein beliebiges Zeichen außer einer neuen Zeile. Die oben genannten regulären Ausdruck für ein H1-Tag und alle ihre Inhalte suchen. Es nutzt die. * Betreiber und ständig irgendwas in Übereinstimmung mit dem Tag. Dieses Muster passt auf:

  <h1> Das ist eine Überschrift. </ h1> <h1> Dies ist eine andere. </ h1> 

Es gibt den ganzen String. Der Operator * wird kontinuierlich Match alles - sogar die Schließung Mitte H1-Tag - weil er gierig ist. Passende den ganzen String ist die beste sie kann.

Lazy-Operatoren

Wir ändern die oben genannten Betreiber, indem ein "?" nachdem es. Dadurch wird es faul:

  / <h1> .*? <\ / H1> / 

Die Regex jetzt erfüllt seine Pflicht und entspricht nur der erste h1-Tag. Eine andere gierig Betreiber, dass dieser dieselbe Eigenschaft verwendet wird (n,). Dies entspricht der vorherigen Ausdruck n oder mehrmals. Wenn es ohne ein Fragezeichen verwendet wird, sieht es für die meisten Wiederholungen möglich. Andernfalls startet es aus n Wiederholungen:

  # Einrichten eines String $ str = 'hihi'; # Match ihn mit dem gierigen (n,) Betreiber preg_match ('/ (hallo) (1 ,}/', $ str, $ treffer); # treffer [0] werden 'hihi' # Match mit den faulen (n,)?  Betreiber preg_match ('/ (hallo) (1 ,}?/', $ str, $ treffer); # treffer [0] wird "hallo" 

2. Zurück Referencing

Zurück in entscheidenden Konzepte hinter Advanced Regular Expressions

Was es tut

Zurück Referenzierung ist ein Weg zum Ausdruck beziehen sich auf bisher übereinstimmende Muster in einem regulären. Zum Beispiel, einen Blick auf diese einfache regex, dass ein Ausdruck in Anführungszeichen Treffer:

  # Set up ein Array von Übereinstimmungen $ treffer = array (); # Erzeuge einen String $ str = "\" Dies ist ein 'String' \ ""; # Traverse mit regulären Ausdrücken preg_match ("/ (\" | ") .*? (\ "|')/", $ str, $ treffer); # drucken gesamten Spiels echo $ treffer [0]; 

Leider wird diese nicht richtig passen die Zeichenfolge. Stattdessen wird es zu drucken:

  "Dies ist eine ' 

Dieser reguläre Ausdruck entspricht der Eröffnung doppelte Anführungszeichen, sondern findet einen anderen Typ von Anführungszeichen um es zu schließen. Das ist, weil es die Möglichkeit der Kommissionierung eine Doppel-oder Einzelzimmer Zitat am Ende gegeben wurde. Um dies zu beheben, können Sie zurück Referenzierung. Die Ausdrücke \ 1, \ 2, ...., \ 9 halten Verweise auf zuvor aufgezeichneten Teilmuster. Die ersten Wetten zu zitieren, in diesem Fall wird durch die Variable statt \ 1.

Wie benutzt man es

Um dieses Konzept zu den oben genannten Beispiel gelten, verwenden Sie \ 1 an Stelle der letzten Zitat:

  preg_match ('/("| \').*? \ 1 / ', $ str, $ treffer); 

Dies wird nun korrekt wieder:

  "Dies ist ein 'string'" 

Denken Sie daran, dass wieder Referenzierung kann auch verwendet werden preg_replace . Beachten Sie, dass anstelle von \ 1 ... \ 9, sollten Sie $ 1 ... $ 9 $ n ... (beliebige Anzahl von Beides wird nicht funktionieren). Zum Beispiel, wenn Sie alle Absatz-Tags mit Text, der sie vertritt, verwenden Sie ersetzen:

  $ Text = preg_replace ('/ <p> (.*?)< \ / p> /', "<p> $ 1 </ p>", $ html); 

Das $ 1 zurück Verweis hält den Text innerhalb des Absatzes und wird in den Pattern ersetzen selbst verwendet. Dieses komplett gültiger Ausdruck zeigt einen einfachen Weg, um übereinstimmende Muster auch während ersetzen zugreifen.

3. Benannten Gruppen

Bei Verwendung von mehreren Artikeln zurück, einen regulären Ausdruck kann schnell unübersichtlich und schwer zu verstehen. Ein alternativer Weg zur Rückbezug wird durch die Verwendung von benannten Gruppen. Eine benannte Gruppe ist mit den spezifizierten durch (?P<name>pattern) , wo ist der Name der Gruppe und Muster des regulären Ausdrucks in der Gruppe selbst. Die Gruppe kann dann durch die verwiesen werden (? P = Name). Betrachten wir zum Beispiel die folgenden:

  / (? P <quote> "|').*?(? P = Zitat) / 

Der obige Ausdruck schafft die gleiche Wirkung wie das vorherige Beispiel Rückbezug, sondern stattdessen mit benannten Gruppen. Es ist auch wesentlich leichter zu lesen.

Benannte Gruppen sind auch nützlich, wenn blätterte durch die Vielzahl von Treffern. Die Bezeichnung für ein bestimmtes Muster ist auch der Schlüssel der entsprechenden Spiele-Array.

  preg_match ('/ (? P <quote> "| \')/',"' String '", $ treffer); # Dies wird" "echo $ print treffer [1]; # Dies wird auch print"' " Echo, wie es eine benannte Gruppe ist $ treffer ['Quote']; 

So genannten Gruppen nicht nur Code leichter zu lesen, sondern auch organisieren.

4. Wortgrenzen

Boundary in entscheidenden Konzepte hinter Advanced Regular Expressions

Word Grenzen sind Orte, in eine Zeichenfolge, die Buchstaben eines Wortes kommen zwischen Charakter und ein Nicht-Wort. Die Spezialität dieser Grenzen ist die Tatsache, dass sie eigentlich gar nicht passen ein Zeichen. Ihre Länge ist gleich Null. Das \b regulären Ausdruck keine Wortgrenze.

Leider sind die Grenzen so oft überflog, dass viele nicht erkennen, ihre eigentliche Bedeutung. Zum Beispiel, sagen wir, Sie wollen das Wort "Import-match":

  / Import / 

Watch out! Reguläre Ausdrücke können tückisch sein. Der obige Ausdruck wird auch übereinstimmen:

  wichtig 

Sie mögen denken, es ist so einfach wie ein Leerzeichen vor und nach der Einfuhr zu verhindern, diese falschen Treffer:

  / Import / 

Aber was ist mit diesem Fall?

  Der Händler habe für den Import 

Beim Import am Anfang oder Ende einer Zeichenkette ist, wird die modifizierte regex scheitern. Somit ist diese Aufteilung bis in Fällen erforderlich:

  / (^ Import | Import | Import-$) / i 

Rückblickend auf unsere regulären Ausdruck, braucht es nicht Zeiträume oder andere Satzzeichen berücksichtigt. Just zu diesem Spiel einziges Wort, eine reguläre Ausdrücke kann wie folgt aussehen:

  / (^ (:|;|,)? Import | Import (:|;|,)? | import (\. | \ I ?|!)?$)/ 

Das ist eine Menge Code nur ein einziges Wort übereinstimmen. Deshalb ist Wortgrenzen so erheblich sind. Um die og Aussage und viele andere Variationen mit Wortgrenzen, alles, was notwendig ist:

  / \ Bimport \ b / 

Dies entspricht jedem Fall vor und vieles mehr. \b 's Flexibilität rührt aus der Tatsache, dass es entspricht einem Null-Zeichenfolge. Alle Spiele es ist ein imaginärer Raum zwischen zwei Zeichen. Es prüft, ob einer der Charaktere ist ein Nicht-Wort-Zeichen und das andere ist ein Wort Charakter. Wenn ja, passt er es. Wenn der Anfang oder das Ende eines Strings angetroffen wird, \b behandelt sie als Nicht-Wort-Charakter. Weil die i im Import als noch ein Wort Charakter, wird es Spiel zu importieren.

Beachten Sie, dass das Gegenteil von \ b \ B ist Dieser Operator wird der Raum im Spiel zwischen zwei-Wort oder zwei Nicht-Wort-Zeichen. Also, wenn Sie möchten, "hallo" in ein anderes Wort übereinstimmen, können Sie verwenden:

  \ Bhi \ B 

5. Atomgruppen

Gruppen in entscheidenden Konzepte hinter Advanced Regular Expressions

Atomic Gruppen sind Gruppen, die spezielle RegEx-Erfassung sind nicht. Sie werden normalerweise verwendet, um die Leistungsfähigkeit eines regulären Ausdrucks zu erhöhen, sondern kann auch angewendet werden zur Beseitigung bestimmten Begegnungen. Eine atomare Gruppe wird durch die Verwendung (angegeben?> Muster):

  / (?> Er | this) / 

Wenn die Regex-Engine eine atomare Gruppe passt, wird es zu verwerfen backtracting Positionen, die mit allen Zeichen innerhalb kam es. Betrachten Sie das Wort "Zerschlagung". Mit den oben genannten regulären Ausdruck, wird die Regex-Maschine zunächst versuchen, das Muster 'Match seiner "in" Zerschlagung ". Es wird keine Übereinstimmung finden. An diesem Punkt wird die Atomgruppe in. Der Motor kick werden alle Positionen Backtracking zu verwerfen. Dies bedeutet, dass es nicht zu "diesem" Search Inside "Zerschlagung". Warum? Wenn "seine" kam nicht wieder ein Spiel, dann natürlich "this" (die auch "sein") wird nicht wieder positiv.

Das obige Beispiel nicht haben viele praktische Anwendungen. Wir könnten auch genutzt haben /t?his?/ statt. Schauen Sie sich die folgenden:

  / \ B (Ingenieur | gravieren | Ende) \ b / 

Wenn die Regex-Maschine gegeben wird das Wort "Engineering", es wird korrekt match "Ingenieur". Die nächsten Wortgrenze, \ b, wird nicht überein. So wird es weiter zum nächsten Treffer: gravieren. Es erkennt, dass die 'eng' Treffer, aber der Rest nicht. Schließlich, 'end' ist und versucht, scheiterten ebenfalls. Wenn Sie genau hinsehen, werden Sie feststellen, dass, sobald der Motor passt 'engineer' und nicht das letzte Wort Grenze, es kann unmöglich match "gravieren" oder "Ende". Diese beiden Spiele sind kleiner als die Worte "Ingenieur" und damit die Regex-Maschine nicht mit den anderen Studien sollten fortgesetzt werden.

  / \ B (?> Ingenieur | gravieren | Ende) \ b / 

Das oben genannte ist eine viel bessere Alternative, dass der Regex-Maschine Zeit zu sparen und verbessern die Effizienz des Codes.

6. Rekursion

Rekursion in entscheidenden Konzepte hinter Advanced Regular Expressions

Rekursion in regulären Ausdrücken können Klammern benutzt werden, um verschachtelte Konstrukte Spiel, wie, (dies (dass)), und HTML-Tags, <div></div> . Sie erfordern den Einsatz von (?R) , ein Betreiber, dass die Muster übereinstimmt rekursive Unterkategorien. Betrachten Sie den regulären Ausdruck, dass verschachtelte Klammern Treffer:

  / \ (((?>[^()]+)|(? R)) * \) / 

Die äußersten Klammern in diesem regulären Ausdruck zu Beginn der verschachtelte Konstrukte. Dann kommt eine optionale Halter, die mithalten können entweder ein Nicht-Klammern Zeichen ( ?>[^()]+ ) oder der ganze Ausdruck wieder in einem sub-Muster (? R). Beachten Sie, dass dieser Operator wiederholt wird, so oft wie möglich auf alle geschachtelten Klammern entsprechen.

Ein weiteres Beispiel für Rekursion bei der Arbeit ist die folgende:

  /((?>[^]+)|((? R )))*/ 

Der obige Ausdruck verbindet Charakter Gruppen, gierige Operatoren, Back-Tracking und Atomgruppen um verschachtelte Tags übereinstimmen. Die erste Gruppe in Klammern ([\ w] +) entspricht dem Tag-Namen für die spätere Verwendung in den regulären Ausdruck. Es geht dann um den Rest des Tag Team Match. Die nächste geklammerten sub-Ausdruck ist sehr ähnlich dem oben. Es entspricht entweder nicht-tag (?>[^]+) Zeichen oder rekursiv über einen anderen Tag (? R). Schließlich entspricht dem letzten Teil des Ausdrucks die enge tag.

7. Callbacks

Rufen Sie in entscheidenden Konzepte hinter Advanced Regular Expressions

Gewisse Übereinstimmungen in einem speziellen Muster können Änderungen erfordern. In Hinblick auf die Anwendung mehrere oder komplexe Änderungen, Rückrufen verwendet werden kann. Ein Rückruf ist die Substitution verwendet für dynamische Strings in preg_replace_callback Funktion. Sie nehmen in einer Funktion als Parameter zu verwenden, wenn eine Übereinstimmung gefunden wird. Diese Funktion erhält das Spiel Array als Parameter und gibt eine modifizierte Zeichenkette, die als Ersatz verwendet wird.

Als Beispiel betrachten wir einen regulären Ausdruck, dass alle Wörter in einer bestimmten Zeichenfolge in Großbuchstaben Veränderungen. Leider hat PHP keine regex Betreiber, dass ein Charakter Änderungen an einen anderen Fall. Zur Erfüllung dieser Aufgabe kann ein Callback verwendet werden. Zunächst muss der Ausdruck entsprechen alle Briefe, die sein Kapital benötigen:

  / \ B \ w / 

Die oben genannten verwendet sowohl Wortgrenzen und Charakter-Klassen an die Arbeit. Jetzt, da wir diesen Ausdruck haben, können wir schreiben eine Callback-Funktion:

  Funktion upper_case ($ treffer) (return strtoupper ($ treffer [0]);) 

upper_case nimmt in einem Array von Übereinstimmungen und gibt den ganzen Wetten Muster in Großbuchstaben. $matches[0] , in diesem Fall stellt das Schreiben, das muss aktiviert werden, um. All dies können nun zusammengefügt werden mithilfe der preg_replace_callback Funktion:

  preg_replace_callback ('/ \ b \ w /', "upper_case", $ str); 

Das ist die Kraft eines einfachen Rückruf.

8. Kommentieren

Reagieren in kritischen Konzepte hinter Advanced Regular Expressions

Kommentieren ist nicht ein Weg, um tatsächlich übereinstimmen Saiten, aber es ist eines der wichtigsten Teile von regulären Ausdrücken. Wie Sie tauchen tief in größeren, komplexeren Ausdrücken, wird es schwer zu entziffern, was tatsächlich abgestimmt. Mit Kommentaren in der Mitte von regulären Ausdrücken ist der perfekte Weg, um diese Verwirrung zu minimieren.

Um einen Kommentar innerhalb des regulären Ausdrucks, verwenden Sie die (?#comment) Format. Ersetzen Sie "Kommentar" mit dem Wort (en) Ihrer Wahl:

  / (? # Stellig) \ d / 

Es ist besonders wichtig, reguläre Ausdrücke, die Sie an die Öffentlichkeit zu äußern. Die Benutzer Ihrer regex können leicht verstehen und ändern Sie die Muster, um ihre Bedürfnisse zu erfüllen. Es kann sogar so weit gehen, um Ihnen zu helfen dekodieren beim Besuch eines Programms.

Betrachten Sie mit dem "X" oder (? X) Modifier für free-Abstand-Modus mit Kommentaren. Dies führt zu einem regulären Ausdruck zu Leerraum zwischen Token zu ignorieren. Alle Räume können noch mit dargestellt werden [ ] oder \ (ein Backslash und ein Leerzeichen):

  / \ D # digit [] # space \ w + # word / x 

Die oben ist der gleiche wie:

  / \ D (? # Stellig) [] (? # Raum) \ w + (? # Wort) / 

Erstellen Sie immer gut dokumentierten Code.

Weitere Ressourcen

(Al)

Hinterlasse einen Kommentar!

Fügen Sie Ihren Kommentar unten, oder Trackback von Ihrer eigenen Website. Sie können auch Kommentare zu diesen abonnieren via RSS.

Seien Sie nett. Keep it clean. Bleiben Sie beim Thema. Kein Spam.

Sie können diese Tags benutzen:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Dies ist ein Gravatar-enabled weblog. Um Ihre eigene weltweit anerkannte-Avatar, registrieren Sie bitte bei Gravatar Blog .