2016-06-26 4 views
1

Ich benutze diesen ziemlich einfachen regulären Ausdruck:Warum beeinflusst das verwendete Trennzeichen die Gültigkeit einer Regex?

^[\x20-\x7E]+$ 

Wenn ich versuche, es funktioniert mit einigen PHP Regex zu verwenden, wie preg_match() es in alleiniger Fall wirft Warnung, wenn ich ~ Zeichen (Tilde) als Trennzeichen verwenden.

So Ausführung folgenden Zeilen geht gut

preg_match("/^[\x20-\x7E]+$/", $s); # delimiter "/" 
preg_match("!^[\x20-\x7E]+$!", $s); # delimiter "!" 
preg_match("#^[\x20-\x7E]+$#", $s); # delimiter "#" 

aber aus irgendeinem Grund, diese Linie

preg_match("~^[\x20-\x7E]+$~", $s); # delimiter "~" 

eine Warnung wirft

Warning: preg_match(): Unknown modifier ']' in some_script.php on line XX 

Anmerkung: es geschieht nur, wenn es verwendet mit doppelten Anführungszeichen!

Ich verwende Tilde die ganze Zeit als Trennzeichen und habe nie Probleme damit bis zu diesem Fall konfrontiert und frage mich wirklich, warum das passiert. Kann nicht finden, dass Tilde in regulären Ausdrücken eine besondere Bedeutung hat (ich bin zu 99% sicher, dass das nicht der Fall ist), oder es ist nur ein Fehler.

kann ich sicherlich umgehen, aber die Frage ist: Was ist der Unterschied zwischen Tilde und anderen Begrenzer?

+0

Verwenden Sie einfach etwas anderes dann! – GordonM

+0

@GordonM Frage ist nicht, wie man das löst, es ist warum es passiert? ;) – Wh1T3h4Ck5

+0

Hmm, denkt es, dass '$ ~' eine Variable ist? Versuche einfache Anführungszeichen ... ''~ ~ [\ x20- \ x7E] + $ ~'' –

Antwort

5

Sie wurden unter Verwendung von doppelten Anführungszeichen:

"~^[\x20-\x7E]+$~" 

was bedeutet, dass beide \x20 und \x7E in PHP String-Kontext interpretiert wurde, nicht von PCRE. Raten Sie, was \x7E beträgt.

So wie @Bitwise erwähnt, verwenden Sie einfache Anführungszeichen. Oder besser entweichen noch die Escape-Sequenzen:

"~^[\\x20-\\x7E]+$~" 

So ist das Regex-Engine noch [\x20-\x7E] sehen statt [ -~].

+0

schön, escape-escape hilft wirklich ... aber immer noch diese Frage, was ist der Unterschied zwischen "~" und "#" oder "!" als Trennzeichen aus der Sicht von PCRE ... mit anderen Trennzeichen muss ich nicht entkommen und der Ausdruck steht immer noch zwischen Anführungszeichen;) – Wh1T3h4Ck5

+0

Es gibt keinen Unterschied. Ihre Tilde-Regex ist fehlgeschlagen, weil PCRE '[- ~]' (ein nicht-deklariertes Trennzeichen) gesehen hat. –

+0

PCRE kennt PHPs-Trennzeichen nicht wirklich. Siehe auch: http://StackOverflow.com/a/31231183/345031 – mario

Verwandte Themen