代码之家  ›  专栏  ›  技术社区  ›  animuson

为什么preg\u match\u都在这么多角色之后大便?

  •  0
  • animuson  · 技术社区  · 15 年前

    我的preg\u match\u all语句有问题。它一直工作得很好,因为我一直在打一篇文章,但突然之间,它通过了一定的长度是停止工作在一起。这是一个已知的功能问题,它只是不做 任何东西 这么多角色之后?

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

    它一直都很好的工作,对其他页面也很好,但是一旦那篇文章超过了一定的长度,poof,它就停止了对那篇文章的工作。有没有其他的解决方案,我可以用它来工作更长的文本块?正在处理的文章长度约为33000个字符(包括空格)。

    pcre.backtrack_limit pcre.recursion_limit 高达50万,完全没有效果。关于为什么会发生这种情况,以及我能做些什么让它继续工作,即使是对于这些巨大的文本块,还有其他的想法吗?30000个字符的限制似乎有点低,只有5000-6000个单词(这个大约是5700个)。在这里,将其拆分并不是一个真正的选项,因为如果它们位于两个单独的文本块中,它将找不到开始和停止。

    2 回复  |  直到 15 年前
        1
  •  0
  •   Charles    15 年前

    看起来您正在使用HTML。您可能需要考虑使用各种解析器之一。例如,DOM a specific class for comments 所以我们知道它可以和他们一起工作。不幸的是,使用DOM有点尴尬。

    XMLReader ,它将XML作为流读取,并将其作为标记进行处理。它似乎明白什么是评论。我自己从来没用过,所以我不能告诉你它有多好用(你可以用DOM的 loadHTML saveXML

    最后,您可以考虑为自定义注释编写一个标记器或解析器。这应该不会太难,而且对您来说,一起动手可能比学习我指出的任何一种XML解决方案都要快。

        2
  •  1
  •   mvds    15 年前

    explode() preg_split()

    引用我的源代码:

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

    但这是两年前的事了。