2016-06-26 21 views
1

我用這個很簡單的正則表達式:爲什麼使用的分隔符影響正則表達式的有效性?

^[\x20-\x7E]+$ 

當我嘗試用一​​些PHP正則表達式函數使用它,因爲preg_match()這樣它唯一的情況下拋出時警告我使用~字符(波浪)作爲分隔符。

所以,以下行的執行進展順利

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

但出於某種原因,這條線

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

拋出一個警告

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

注:這只是發生時,它的用雙引號!

我一直使用代字號作爲分隔符,從來沒有面對它的問題,直到這種情況下,真的想知道爲什麼發生這種情況。找不到代字號在正則表達式中有一些特殊的含義(我現在99%確定它沒有),或者它只是一個錯誤。

我當然可以解決這個問題,但問題是:代字號和其他任何分隔符有什麼區別?

+0

只需使用其他的東西! – GordonM

+0

@GordonM問題不是如何解決這個問題,這是爲什麼它會發生? ;) – Wh1T3h4Ck5

+0

嗯,它認爲'$〜'是一個變量?嘗試單引號...''^^[\ x20- \ x7E] + $〜'' –

回答

5

你使用雙引號:

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

這意味着這兩個\x20\x7E得到了解釋,在PHP字符串上下文,而不是由PCRE。猜猜\x7E是什麼。

所以@Bitwise提到,使用單引號。或者更好的是逃避轉義序列:

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

因此正則表達式引擎仍將看到[\x20-\x7E]而不是[ -~]

+0

不錯,逃避逃生真的有幫助...但仍然存在這個問題,「〜」和「#」或「!」之間有什麼區別?作爲PCRE的觀點的分隔符......與其他分隔符不同,我不必逃避,表達式仍然在雙引號之間;) – Wh1T3h4Ck5

+0

沒有區別。你的代字符正則表達式失敗了,因爲PCRE看到了'[ - 〜]'(一個未轉義的分隔符)。 –

+0

PCRE並不真正瞭解PHP的分隔符。另請參閱:http://stackoverflow.com/a/31231183/345031 – mario

相關問題