Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 为什么preg_match_在扮演了这么多角色后都会大便?_Php_Limit_Preg Match All - Fatal编程技术网

Php 为什么preg_match_在扮演了这么多角色后都会大便?

Php 为什么preg_match_在扮演了这么多角色后都会大便?,php,limit,preg-match-all,Php,Limit,Preg Match All,我的preg_match_all声明有问题。它一直工作得很好,因为我一直在打印一篇文章,但在它超过一定长度后,突然停止工作。这是函数的一个已知问题吗?在这么多字符之后它什么都不做 $number = preg_match_all("/(<!-- ([\w]+):start -->)\n?(.*?)\n?(<!-- \\2:stop -->)/s", $data, $matches, PREG_SET_ORDER); $number=preg\u match\u all(

我的preg_match_all声明有问题。它一直工作得很好,因为我一直在打印一篇文章,但在它超过一定长度后,突然停止工作。这是函数的一个已知问题吗?在这么多字符之后它什么都不做

$number = preg_match_all("/(<!-- ([\w]+):start -->)\n?(.*?)\n?(<!-- \\2:stop -->)/s", $data, $matches, PREG_SET_ORDER);
$number=preg\u match\u all(“/()\n”(.*?\n?()/s“,$data,$matches,preg\u SET\u顺序);
它一直都很好用,在其他页面也很好用,但一旦那篇文章超过了一定的长度,poof,它就停止了那篇文章的工作。有没有另一种解决方案,我可以使用它的工作更长的文本块?正在处理的文章长度约为33000个字符(包括空格)


我以前问过这样一个问题,但只得到了一个我从未真正测试过的答案。上一次我刚刚找到了另一种方法来解决这个特定场景,但这次没有办法解决它,因为这都是一篇文章。我尝试将
pcre.backtrack\u limit
pcre.recursion\u limit
更改为甚至500000,但完全没有效果。关于为什么会发生这种情况,以及我能做些什么来让它继续工作,即使是对于这些大量的文本块,还有其他的想法吗?30000个字符的限制似乎有点低,只有5000-6000个单词(这个大约是5700个)。在这里,将其拆分并不是一个真正的选项,因为如果它们位于两个单独的文本块中,它将找不到开始和停止。

我曾经遇到过这个问题,当时唯一可以解决它的方法是拆分字符串。您可以
explode()
preg\u split()

从我的源代码中逐字引用:

    // regexps have failed miserably on very large tables...
    $parts = explode("<table",$html);
//regexp在非常大的表上失败得很惨。。。

$PASS =爆炸(看起来像是在使用HTML。你可能想考虑使用各种解析器中的一个。例如,DOM,所以我们知道它可以和它们一起工作。不幸的是,DOM有点笨拙。

另一个选择可能是使用,它将XML作为流读取,并将其作为标记处理。它似乎理解注释是什么。我自己从未使用过它,所以我无法告诉您它的工作情况。(您可以使用DOM和方法将HTML转换为XML,假设它的格式不太糟糕。)


最后,你可以考虑为自定义注释编写一个记录器或解析器。它不应该太难,也可能比你学习的任何一个XML解决方案都快,但是当它“停止工作”时,到底发生了什么?错误返回?沉默失败匹配?挂咀嚼100% CPU?(我想您可能编写了一个regexp,它会触发PCRE匹配算法的指数最坏情况行为,但没有详细信息,我不能确定。)它什么也不做,只返回0,没有错误或任何东西。您是否检查了

preg\u last\u error()
?记不起我做过什么。@mvds:是的,它什么也不返回(0).32767是16位有符号整数的最大值。