2012-08-02 35 views
1

我發現如果我嘗試在很長的字符串上使用preg_replace,PHP會向我的瀏覽器返回一個空白頁面,而不會顯示錯誤消息。我能夠在我的測試環境中重現此錯誤。 preg_replace可以處理的字符串的最大長度是多少?可以增加這個長度嗎?PHP中preg_replace()的字符串的最大長度?

+0

「我能夠重現此錯誤在我的測試環境」 ---在這裏展示的劇本我用從這裏下載的功能 – zerkms 2012-08-02 03:18:34

+0

:HTTP:// nadeausoftware.com/articles/2007/9/php_tip_how_strip_punctuation_characters_web_page 我記得之前我使用正則表達式從HTML文件中提取數據時發生了這個問題,所以它不是正則表達式的問題。 – 2012-08-02 03:34:17

+0

那麼現在的問題是什麼呢? – zerkms 2012-08-02 03:51:20

回答

0

沒有任何。只要你的腳本數據適合內存 - 它會工作。

+1

腳本數據可能,但正則表達式可能會進入回溯死亡螺旋。 – 2012-08-02 04:08:28

+0

@Marc乙:意味着所有的數據 - 無論是隱式還是顯式管理。並且在內部問題的情況下 - 它仍然會因內存不足而死亡 – zerkms 2012-08-02 04:21:18

+0

empty page = display_errors off和whatnot。 – 2012-08-02 04:24:16

0

我遇到了這個問題太多,使用此正則表達式(我發現它的地方,我不記得了):

'~\[quote(?:=([^\]]+))?\]((?:(?R)|.)*?)\[/quote\]~s' 

這是用來代替嵌套報價BBcodes,使用(R?)遞歸模式修飾符。

當引號之間的字符串接近300個字符(這確實很少)時,我會在瀏覽器中看到一個「Reset connexion」。 Apache或PHP的錯誤日誌中沒有任何內容(我正在使用PHP 5.4.16運行Wampserver 2.4)。 (?R)experimental facility。 對這個職位:PHP, nested templates in preg_replace,存在與(R?),它詳細地進行說明,這使我的作品在更長串的解決方案正則表達式:

'%\[quote(?:=([^\]]+))?\]((?:[^[]*(?:\[(?!/?quote(?:=[^\]]+)?\])[^[]*)*|(?R))*)\[/quote\]%x' 

希望它能幫助。 乾杯

2

對於4M以上的$模式匹配字符串,我也是這樣。 可能您將不得不使用ini_set()或編輯php.ini來增加pcre.backtrack_limit

去年錯誤檢查預浸:

$retval = preg_replace ($pattern, $replacement, $subject); 
    if ($retval === null) { 
     // see http://php.net/manual/en/function.preg-last-error.php 
     echo preg_last_error(); 
    }