0

我的 preg_match_all 语句有问题。它一直在完美地工作,因为我一直在输入一篇文章,但是在它经过一定长度后突然停止工作。这是功能的一个已知问题,在这么多字符之后它什么都不做?

$number = preg_match_all("/(<!-- ([\w]+):start -->)\n?(.*?)\n?(<!-- \\2:stop -->)/s", $data, $matches, PREG_SET_ORDER);

它一直运行良好,并且在其他页面上运行良好,但是一旦那篇文章超过了一定的长度,噗,它就停止为那篇文章工作了。我可以使用另一种解决方案来使其适用于更长的文本块吗?正在处理的文章长度约为 33,000 个字符(包括空格)。

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

4

2 回答 2

1

我曾经碰到过这个,当时我唯一能解决它的方法就是拆分字符串。你可以explode()preg_split()

从我的源代码中直接引用:

    // regexps have failed miserably on very large tables...
    $parts = explode("<table",$html);

但这是两年前的事了。

于 2010-07-16T02:09:50.000 回答
0

看起来您正在使用 HTML。您可能需要考虑使用各种解析器之一。例如,DOM 有一个特定的评论类,所以我们知道它可以与它们一起工作。不幸的是,使用 DOM 有点尴尬。

另一种选择可能是使用XMLReader,它将 XML 作为流读取并将其作为标记进行处理。它似乎明白评论是什么。我自己从未使用过它,所以我无法告诉你它的效果如何。(您可以使用 DOM 的loadHTMLsaveXML方法将您的 HTML 转换为 XML,假设它的格式不是太可怕。)

最后,您可能会考虑为您的自定义注释编写分词器或解析器。这应该不会太难,而且可能比学习我指出的任何一种 XML 解决方案更快。

于 2010-07-16T04:39:58.883 回答