Rumah > pembangunan bahagian belakang > tutorial php > 各位大神,小弟在使用preg_match_all时候遇到的一个奇怪的问题

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

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
Lepaskan: 2016-06-20 12:26:14
asal
1404 orang telah melayarinya

我在使用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\})\}/';
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

字符串是:
<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>
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk


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



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

字符串是:
<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>
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk



preg_match_all($pattern, $this->content, $matches);
Salin selepas log masuk
Salin selepas log masuk

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



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



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

字符串是:
<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>
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk



preg_match_all($pattern, $this->content, $matches);
Salin selepas log masuk
Salin selepas log masuk

$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>
Salin selepas log masuk

但是如果剪短的话,就不能完成我的需求,请大神指点
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan