2013-10-16 59 views
2

的preg_match停止執行代碼這裏的問題: 這行代碼PHP沒有錯誤

preg_match("/^([^<>}{\|])+$/", "Testing bla di bla and more stupid text text text") 

完全停止我的腳本。 如果我把最後一個「文本」從它中拿出來,它會起作用並給我一個結果。

原代碼是不是我的,我不擅長用正則表達式,但這個想法是檢查以下任何特殊字符在文本:

^ < > { } \ | 

在我的搜索,我發現一些關於PREG_RECURSION_LIMIT_ERROR,但將其設置爲10000並沒有改變任何東西。 preg_last_error()也沒有幫助,因爲腳本只能在輸出或記錄任何內容之前停止。 PHP錯誤日誌中沒有任何內容。

我有兩個問題:

  1. 爲什麼它只是停止沒有任何通知?
  2. 是否有更好的方法來編寫可能不會導致此問題的正則表達式模式?

謝謝!

PS:我正在運行PHP 5.2.9版本,其目的是爲了防止特殊字符被保存,所以我想檢測它們的存在並拒絕提交的文本。

+0

什麼是-1?我不只是要求正則表達式的幫助,但我有我認爲沒有錯誤記錄的合法技術問題,並且我至少已經完成了一些研究,如我所述...... – semmelbroesel

+1

您可以嘗試PHP的filter_var()。 http://php.net/manual/en/function.filter-var.php我不知道它的速度。如果你知道這只是文本,那麼其中一個ctypes也可能有幫助。也許這個正則表達式'[\^<> \} \ {\ |] +'會很有用。留下前導'^'和尾部'$'將使它只匹配符號,如果它們是匹配的短語的開始和結尾。 – asafreedman

+1

_「爲什麼它只是在沒有任何通知的情況下停下來?」_這意味着你會造成一個致命的錯誤。定義error_reporting和error_log不是在你的腳本中,而是在更早的時候(.htaccess,webserver config,php.ini),它會記錄它遇到的致命錯誤。 – Wrikken

回答

3

我儘量避免使用正則表達式。它太亂了。總有一個更好的方法。看看這個...

$chars = "^<>{}\|"; 
$text = "Testing bla di bla and more stupid text text text"; 
if(strpbrk($text, $chars) == false){ 
    echo 'Not Found'; 
} else { 
    echo 'char in text'; 
} 
+0

PHP有最古怪的函數名稱... –

+0

@BrandonWamboldt它實際上只是從[一個C函數](http://pubs.opengroup.org/onlinepubs/009695299/functions/strpbrk.html)。 – Gumbo

+0

我喜歡不必使用preg_match這樣的想法 - 我從來沒有見過strpbrk,但它會非常有用!謝謝! – semmelbroesel

2

你的正則表達式是錯誤的,它也不是很清楚。這是做你想要什麼更好的辦法:

if (preg_match("/[<>}{\\|]/", "Testin{g bla di bla and more stupid text text text")) { 
    echo "Contains illegal characters!"; 
    exit; 
} 

在你的正則表達式,你需要躲避特殊字符\|。儘管如此,我的觀點還是比較清楚。

+0

實際上,如果它位於'[括號]內',則不需要轉義'|'。不傷害,但不是強制性的。只是在說。 ;) – jerdiggity

+0

@jerdiggity很高興知道,我已經更新了我的答案。 –

1

我想也許你剛剛得到了+在錯誤的地方。試試這個:

preg_match("/^([^<>}{\\|]+)$/", "Testing bla di bla and more stupid text text text") 

簡要說明:由於+意味着一個或多個以前的「東西」,你的代碼告訴它來尋找一個或多個以前(group)+,而不是一個或多個的([^charactersNotHere]+)