2009-09-09 109 views
0

有沒有人知道爲什麼下面的filter_var()函數會生成警告?字符類中可以有多少個字符是否有限制?PHP的filter_var()函數生成警告

$regex = "/^[\w\041\042\043\044\045\046\047\050\051\052\053\054\055\056\057\072\073\074\075\076\077\100\133\134\135\136\140\173\174\175\176]*$/"; 

$string = "abc"; 

if(!filter_var($string, FILTER_VALIDATE_REGEXP, array("options" => array("regexp"=>$regex)))) 
{ 
    echo "dirty"; 
} 

else 
{ 
    echo "clean"; 
} 

警告:filter_var()[function.filter-VAR]:未知的修飾詞 ':'

回答

3

你的正則表達式是由PHP解釋爲字符串:

string '/^[\w!"#$%&'()*+,-./:;<=>[email protected][\]^`{|}~]*$/' (length=40) 

(使用var_dump在$正則表達式,你會得到)

在你的正則表達式的中間,所以,有一個斜線;由於您使用斜線來劃定正則表達式(它是$regex的第一個字符),因此PHP認爲該中間的斜槓標記正則表達式的結束。

所以,PHP認爲你的正則表達式居然是:

/^[\w!"#$%&'()*+,-./ 

結束斜槓被解釋爲modifiers後到來的每個字符。

而':'不是一個有效的修飾符。

你可能想逃跑的正則表達式;-)
以及一些其他字符,順便說一句中間的斜線...

用於該解決方案可能是使用preg_quote功能。

+0

謝謝您的幫助。它現在可以工作,因爲我使用它的ASII代碼「134」添加了反斜槓。我將在下面的另一個答案當前正則表達式。 – lanmind 2009-09-09 20:22:16

+0

不客氣:-)但我的腦海裏有一個問題:爲什麼你使用ASCII碼,而不是直接輸入字符?理解你的正則表達式會更容易,那樣,你不覺得嗎? – 2009-09-10 04:09:55

+0

我在3秒左右就考慮過了,哈哈!答案是,我在之前使用了空格字符的ANCII代碼,之後我的後腦就告訴我要爲特殊字符做這件事。我有可能改變我的方式:) – lanmind 2009-09-10 05:47:22

0

這裏是當前工作的正則表達式:

/^[\w\041\042\043\044\045\046\047\050\051\052\053\054\134\055\056\134\057\072\073\074\075\076\077\100\133\134\134\134\135\134\136\140\173\174\175\176]*$/i