各位大神,小弟在使用preg_match_all時候遇到的一個奇怪的問題

來源:互聯網
上載者:User
我在使用preg_match_all的時候匹配一個比較長串的字串的時候,apache就會崩潰,最後顯示頁面載入失敗
後來上網查了一下說是要把
ini_set('pcre.backtrack_limit', 999999999);
ini_set('pcre.recursion_limit', 99999);
設成這樣的,但是發現並沒有什麼用,折騰了好長時間沒有辦法解決,懇請大神們指點
下面的連結是我參考原文,上面兩個解決思路也是從下面連結上複製而來的
http://www.php230.com/1410840481.html


回複討論(解決方案)

那麼你的 規則串 和 待匹配文本 都是什麼樣自的呢?
凡事都有個度,超過了自然就會出問題
比如 反向參考 不宜超過 9 個,超過了就會產生歧義
資料庫的 Text 類型 只能儲存 64k 內容,preg 函數在實現時也會考慮這個因素,預留巨大的狀態跳躍表空間也是一種浪費

那麼你的 規則串 和 待匹配文本 都是什麼樣自的呢?
凡事都有個度,超過了自然就會出問題
比如 反向參考 不宜超過 9 個,超過了就會產生歧義
資料庫的 Text 類型 只能儲存 64k 內容,preg 函數在實現時也會考慮這個因素,預留巨大的狀態跳躍表空間也是一種浪費


學習了·····PHP精度問題是個很大的問題

那麼你的 規則串 和 待匹配文本 都是什麼樣自的呢?
凡事都有個度,超過了自然就會出問題
比如 反向參考 不宜超過 9 個,超過了就會產生歧義
資料庫的 Text 類型 只能儲存 64k 內容,preg 函數在實現時也會考慮這個因素,預留巨大的狀態跳躍表空間也是一種浪費



Regex是這樣的
$pattern = '/\{(\{(\w+)(?:(?!\{\{).|\n)+\{\/\2\})\}/';

字串是:
            TODO supply a title                                {{foreach ($message1 as $key1 => $value1)}        {$key1} =>        {foreach ($value1 as $key2 => $value2)}            {foreach ($value2 as $key3 => $value3)}                {if($value3 == 0)}                    

{$key3}=>female

{else if($value3 == 1)}

{$key3}=>male

{else}

{$key3}=>{$value3}

{/if} {/foreach} {/foreach} {/foreach}}


那麼你的 規則串 和 待匹配文本 都是什麼樣自的呢?
凡事都有個度,超過了自然就會出問題
比如 反向參考 不宜超過 9 個,超過了就會產生歧義
資料庫的 Text 類型 只能儲存 64k 內容,preg 函數在實現時也會考慮這個因素,預留巨大的狀態跳躍表空間也是一種浪費



Regex是這樣的
$pattern = '/\{(\{(\w+)(?:(?!\{\{).|\n)+\{\/\2\})\}/';

字串是:
            TODO supply a title                                {{foreach ($message1 as $key1 => $value1)}        {$key1} =>        {foreach ($value1 as $key2 => $value2)}            {foreach ($value2 as $key3 => $value3)}                {if($value3 == 0)}                    

{$key3}=>female

{else if($value3 == 1)}

{$key3}=>male

{else}

{$key3}=>{$value3}

{/if} {/foreach} {/foreach} {/foreach}}



preg_match_all($pattern, $this->content, $matches);

$this->content就是上面的字串的內容,在運行preg_match_all的時候,程式就崩潰了



那麼你的 規則串 和 待匹配文本 都是什麼樣自的呢?
凡事都有個度,超過了自然就會出問題
比如 反向參考 不宜超過 9 個,超過了就會產生歧義
資料庫的 Text 類型 只能儲存 64k 內容,preg 函數在實現時也會考慮這個因素,預留巨大的狀態跳躍表空間也是一種浪費



Regex是這樣的
$pattern = '/\{(\{(\w+)(?:(?!\{\{).|\n)+\{\/\2\})\}/';

字串是:
            TODO supply a title                                {{foreach ($message1 as $key1 => $value1)}        {$key1} =>        {foreach ($value1 as $key2 => $value2)}            {foreach ($value2 as $key3 => $value3)}                {if($value3 == 0)}                    

{$key3}=>female

{else if($value3 == 1)}

{$key3}=>male

{else}

{$key3}=>{$value3}

{/if} {/foreach} {/foreach} {/foreach}}



preg_match_all($pattern, $this->content, $matches);

$this->content就是上面的字串的內容,在運行preg_match_all的時候,程式就崩潰了



再補充一點,這個Regex是要匹配{{foreach ...}........{/foreach}}的內容
另外我測試過了,把上面的字串長度剪短,變成下面這樣的,preg_match_all就可以正常的運行,
            TODO supply a title                                {{foreach ($message1 as $key1 => $value1)}        {$key1} =>        {foreach ($value1 as $key2 => $value2)}            {foreach ($value2 as $key3 => $value3)}                

{$key3}=>{$value3}

{/foreach} {/foreach} {/foreach}}

但是如果剪短的話,就不能完成我的需求,請大神指點
  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.