2010-05-25 65 views
0

在我的網站上,我使用輸出緩衝來獲取所有輸出,然後在將它發送到瀏覽器之前通過流程函數運行它(我不替換任何東西,只是將其分解爲更易於管理的部分)。在這種特殊情況下,有大量的產出,因爲它列出了數據庫中每個國家(大約240個國家)的標籤。問題是,完全,我的preg_match函數似乎被跳過了,它什麼也沒做,並且沒有返回任何匹配。但是,如果我刪除部分標籤(不包括特定部分,只是隨機部分以減少字符),則preg_match函數將再次起作用。我從標籤中刪除的內容似乎並不重要,但似乎只要我刪除了這麼多的字符。對preg函數可以處理的內容是否存在某種限制,或者如果要掃描的數據太多,是否會超時?preg函數的最大字符數限制?

編輯:這是它貫穿的功能。

public function boom($data) { 
    $number = preg_match_all("/(<!-- ([\w]+):start -->)\n?(.*?)\n?(<!-- \\2:stop -->)/s", $data, $matches, PREG_SET_ORDER); 
    if ($number == 0) $data = array("content" => $data); 
    else unset($data); 
    foreach ($matches as $item): 
     //$item[3] = preg_replace("/\n/", "", $item[3], 1); 
     if (preg_match("/<!-- breaker -->/s", $item[3])) $data[$item[2]] = explode("<!-- breaker -->", $item[3]); 
     else $data[$item[2]] = $item[3]; 
    endforeach; 
    //die(var_dump($data)); 
    return $data; 
} 

這裏是未處理的輸出發送到頁面。我已經確定它是preg_match_all在開始處返回變量中的0個匹配項,所以函數只是將其收到的整個字符串放入$data['content']並跳過其他所有內容。

http://pastebin.com/iGfM6gxx

我試圖把新線的標籤,摺疊在一起,似乎沒有任何工作。但正如上面所解釋的那樣,如果我刪除它的隨機部分,那麼它會很好。該功能與其他正常長度的頁面完美兼容。

回答

0

很難說沒有看到你的正則表達式和數據,但嘗試改變pcre.backtrack_limit/pcre.recursion_limit(http://www.php.net/manual/en/pcre.configuration.php

+0

我已經更新我的輸出和功能的問題。 – animuson 2010-05-25 16:32:47

+0

我測試過了,它對我很好(php 5.3)。但是,無論如何,嘗試使用「/(<! - ([\ w] +):start - >)\ n?| \ n?(<! - \\ 2:stop - >)/ s 「而是。 – 2010-05-26 00:01:25

+0

嗯,我想這只是一個謎,爲什麼它不適合我。感謝您的修改。我發現了一個簡單的解決方法,我實際上已經在系統中實現了這個解決方案,因此我不需要額外的編碼。我只是將兩個單獨的部分手動存儲到陣列中,就像它已經被處理過一樣。 – animuson 2010-05-27 16:48:30

相關問題