各位大神,小弟在使用preg_match_all时候遇到的一个奇怪的问题

WBOY
Release: 2016-06-20 12:26:14
Original
1319 people have browsed it

我在使用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 函数在实现时也会考虑这个因素,预留巨大的状态转移表空间也是一种浪费



正则表达式是这样的
$pattern = '/\{(\{(\w+)(?:(?!\{\{).|\n)+\{\/\2\})\}/';
Copy after login
Copy after login
Copy after login

字符串是:
<html>    <head>        <title>TODO supply a title</title>        <meta charset="UTF-8">        <meta name="viewport" content="width=device-width, initial-scale=1.0">    </head>    <body>        {{foreach ($message1 as $key1 => $value1)}        {$key1} =>        {foreach ($value1 as $key2 => $value2)}            {foreach ($value2 as $key3 => $value3)}                {if($value3 == 0)}                    <p>{$key3}=>female</p>                {else if($value3 == 1)}                    <p>{$key3}=>male</p>                {else}                    <p>{$key3}=>{$value3}</p>                {/if}            {/foreach}        {/foreach}    {/foreach}}    </body></html>
Copy after login
Copy after login
Copy after login


那么你的 规则串 和 待匹配文本 都是什么样自的呢?
凡事都有个度,超过了自然就会出问题
比如 向后引用 不宜超过 9 个,超过了就会产生歧义
数据库的 Text 类型 只能存储 64k 内容,preg 函数在实现时也会考虑这个因素,预留巨大的状态转移表空间也是一种浪费



正则表达式是这样的
$pattern = '/\{(\{(\w+)(?:(?!\{\{).|\n)+\{\/\2\})\}/';
Copy after login
Copy after login
Copy after login

字符串是:
<html>    <head>        <title>TODO supply a title</title>        <meta charset="UTF-8">        <meta name="viewport" content="width=device-width, initial-scale=1.0">    </head>    <body>        {{foreach ($message1 as $key1 => $value1)}        {$key1} =>        {foreach ($value1 as $key2 => $value2)}            {foreach ($value2 as $key3 => $value3)}                {if($value3 == 0)}                    <p>{$key3}=>female</p>                {else if($value3 == 1)}                    <p>{$key3}=>male</p>                {else}                    <p>{$key3}=>{$value3}</p>                {/if}            {/foreach}        {/foreach}    {/foreach}}    </body></html>
Copy after login
Copy after login
Copy after login



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

$this->content就是上面的字符串的内容,在运行preg_match_all的时候,程序就崩溃了



那么你的 规则串 和 待匹配文本 都是什么样自的呢?
凡事都有个度,超过了自然就会出问题
比如 向后引用 不宜超过 9 个,超过了就会产生歧义
数据库的 Text 类型 只能存储 64k 内容,preg 函数在实现时也会考虑这个因素,预留巨大的状态转移表空间也是一种浪费



正则表达式是这样的
$pattern = '/\{(\{(\w+)(?:(?!\{\{).|\n)+\{\/\2\})\}/';
Copy after login
Copy after login
Copy after login

字符串是:
<html>    <head>        <title>TODO supply a title</title>        <meta charset="UTF-8">        <meta name="viewport" content="width=device-width, initial-scale=1.0">    </head>    <body>        {{foreach ($message1 as $key1 => $value1)}        {$key1} =>        {foreach ($value1 as $key2 => $value2)}            {foreach ($value2 as $key3 => $value3)}                {if($value3 == 0)}                    <p>{$key3}=>female</p>                {else if($value3 == 1)}                    <p>{$key3}=>male</p>                {else}                    <p>{$key3}=>{$value3}</p>                {/if}            {/foreach}        {/foreach}    {/foreach}}    </body></html>
Copy after login
Copy after login
Copy after login



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

$this->content就是上面的字符串的内容,在运行preg_match_all的时候,程序就崩溃了



再补充一点,这个正则表达式是要匹配{{foreach ...}........{/foreach}}的内容
另外我测试过了,把上面的字符串长度剪短,变成下面这样的,preg_match_all就可以正常的运行,
<html>    <head>        <title>TODO supply a title</title>        <meta charset="UTF-8">        <meta name="viewport" content="width=device-width, initial-scale=1.0">    </head>    <body>        {{foreach ($message1 as $key1 => $value1)}        {$key1} =>        {foreach ($value1 as $key2 => $value2)}            {foreach ($value2 as $key3 => $value3)}                <p>{$key3}=>{$value3}</p>            {/foreach}        {/foreach}    {/foreach}}    </body></html>
Copy after login

但是如果剪短的话,就不能完成我的需求,请大神指点
source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
About us Disclaimer Sitemap
php.cn:Public welfare online PHP training,Help PHP learners grow quickly!