2013-10-17 71 views
0

我試圖驗證對已經在我身上強加以下正則表達式的字符串:PHP非常嚴格複雜的字符串驗證使用的preg_match

[-,.:; 0-9A-Z&@$£¥€'"«»‘’「」?!/\\()\[\]{}<>]{3}[-,.:; 0-9A-Z&@$£¥€'"«»‘’「」?!/\\()\[\]{}<>*=#%+]{0,157} 

任何人可以用PHP編寫一個preg_match驗證輸入幫助反對這個字符串?我很努力,因爲:

  1. 我正則表達式的知識不是擺在首位的是偉大的
  2. 我看到在正則表達式本身的特殊字符,我覺得肯定PHP不會高興我直接插入一個字符串(如$£¥€)

在徒勞的希望我剛剛試了一下扎進preg_match,轉義雙引號,即:

$ste = "Some string input"; 

if(preg_match("/[-,.:; 0-9A-Z&@$£¥€'\"«»‘’「」?!/\\()\[\]{}<>]{3}[-,.:; 0-9A-Z&@$£¥€'\"«»‘’「」?!/\\()\[\]{}<>*=#%+]{0,157}/",$ste)) 
{ 
    echo "OK"; 
} 
else 
{ 
    echo "Not OK"; 
} 

謝謝進階ANCE!

+0

你已經有了你的正則表達式。那麼這是關於什麼的? –

+0

所以,你想要一個字符串,可以匹配一個正常表達式,你不知道的功能?爲什麼? – davidkonrad

+0

你應該啓用錯誤報告,你會注意到你應該在你的正則表達式中轉義'/'或者把分隔符替換成'〜'。 – HamZa

回答

1

PHP將與表達式中的「特」字非常開心,只要你做到以下幾點:

  1. 確保輸入的字符串進行編碼,UTF-8編碼。

  2. 確保您的PHP程序文件使用UFT-8編碼保存。 (顯然你也需要在系統的所有其他部分使用UTF-8編碼,否則你會得到一些位於線路某處的borked字符,但這不在這個問題的範圍之內)但是這不在這個問題的範圍之內)

  3. 添加將u修飾符添加到正則表達式模式字符串的末尾,以通知正則表達式解析器處理UTF-8字符。即:

    preg_match("/....../u", ...); 
            ^
           add this 
    

除此之外,你有它已經幾乎現貨。

+1

我會毀掉情緒,在表達式的某個地方有這樣的''「?!/ \\()'。現在注意表達式中的'/',它也被用作分隔符,這意味着它會拋出一個錯誤'unknown modifier ...'。 – HamZa

+0

謝謝你的非關鍵答案。欣賞你的時間。這是所有UTF8文件和系統中的編碼。我試着在最後添加u,但它仍然沒有正確識別模式:( –

+1

@DanielProcter:HamZa確實有一個關於流氓斜線的觀點;我錯過了(我認爲該模式已經完全逃脫了,因爲它已經給出了作爲一個既成事實,但顯然不是)最簡單的解決方案是使用不同的分隔符,它不在字符串中,也許在表達式的開始和結尾使用'〜'而不是'/' (或者你可以逃避模式中的'/'字符,但是如果模式已經強加給你,最好不要改變它,如果你可以幫忙的話) – Spudley

1

你可以這樣做:

if (preg_match('~^[ -"$&-),-<>?-\]{}£¥€«»‘’「」]{3}[ -\]{}£¥€«»‘’「」]{0,157}$~u', $ste)) 
    echo 'OK'; 
else 
    echo 'Not OK'; 

我已經增加了對Unicode的「u」的修改,並減少使用範圍字符類的大小(例如:,-<意味着,<之間的所有字符unicode表)

但最重要的,我加錨^$這意味着respectivly 開始結束的字符串的