2012-09-25 18 views
10

Ich habe den regulären Ausdruck '!\d!' innerhalb der PHP preg_match Funktion gesehen. Was zur Hölle ist das?Regulärer Ausdruck mit Ausrufezeichen auf beiden Seiten ('! D!')

+7

Was mit dem downvotes ist? Es könnte besser formuliert sein, aber ich denke, das ist eine vernünftige Frage. Das Suchen nach Interpunktion ist grundsätzlich unmöglich und es sind drei Klicks von der "preg_match" -Doc-Seite zur PCRE-Regex-Delimiter-Doc-Seite. Und du musst wissen, dass du nach "regex delimiter" suchst, aber dann kennst du schon die Antwort ... – verdesmarald

+0

Ich habe PHP schon seit Jahren programmiert und das habe ich noch nie gesehen! als Delimeter verwendet! Ich habe gegoogelt und diese sehr hilfreiche Frage gefunden. P.S. Ich vermute, dass es nicht als Trennzeichen verwendet wird, da es weniger lesbaren Code enthält. Auf den ersten Blick interpretiere ich das Ausrufezeichen als "nicht" oder "negative Übereinstimmung", viele andere glaube ich auch, deshalb vermeiden sie es zugunsten der Lesbarkeit. –

Antwort

12

Vom PHP PCRE docs:

Wenn die PCRE-Funktionen verwenden, ist es erforderlich, dass das Muster durch Trennzeichen eingeschlossen ist. Ein Begrenzer kann ein beliebiger nicht alphanumerischer Nicht-Backslash-Zeichen sein.

In diesem Fall wird einfach ! als Trennzeichen verwendet. Häufig wird es verwendet, wenn Sie das normale Trennzeichen innerhalb der Regex selbst verwenden möchten, ohne es zu entfliehen. In diesem Fall nicht wirklich notwendig, da der Rest der Regex einfach \d ist, aber es ist praktisch für Dinge wie die Überprüfung, dass ein Pfad mehr als drei Verzeichnisebenen enthält. Sie können entweder verwenden:

/\/.*\/.*\/.*\/ blah blah blah/

oder:

!/.*/.*/.*/ blah blah blah ! 

Jetzt haben sie gründlich nicht getestet und kann nicht vollständig funktionieren wie beworben, aber man sollte die allgemeine Idee erneut die minimale Entkommen bekommen erforderlich.

Ein anderes Beispiel (von der Seite, die mit oben verknüpft ist) ist zu überprüfen, ob eine Zeichenfolge mit dem http:// Marker beginnt. Einer dieser beiden:

/^http:\/\// 
!^http://! 

würde ausreichen, aber die zweite ist leichter zu verstehen.

+0

Warum nicht einfach '\ d' schreiben? – Graduate

+0

Nun, es funktioniert nicht, ich überprüfte ... – Graduate

+0

@Graduate, wollten Sie wissen, was die Regex bedeutete. Ich habe auch einen Grund angegeben, warum alternative Trennzeichen nützlich sein können, mit der vollständigen Offenlegung, dass es möglicherweise behoben werden muss. Die Absicht war einfach zu zeigen, wie viel _cleaner_ eine Regex sein kann, indem man alternative Delimiter verwendet, ich habe nicht vorgeschlagen, dass Sie diese Samples verwenden sollten (zumindest nicht ohne Debuggen und Fixieren des "blah blah blah" -Bits). – paxdiablo

5

! wird als Trennzeichen verwendet, \d entspricht der einzelnen Ziffer.

Es ist die gleiche wie /[0-9]/

+1

Danke, ich dachte, du musst immer das Zeichen "/" verwenden. Ich wusste nicht, dass ich es ersetzen kann. – Graduate