【问题标题】:Maximum length of string preg_match_all can match and acquire?字符串 preg_match_all 可以匹配和获取的最大长度?
【发布时间】:2013-08-20 05:24:17
【问题描述】:

我正在尝试使用 preg_match_all() 解析一些网页,其中一些非常大,有几 MB 大小。并且其中一个正则表达式匹配一些大到似乎无法匹配和获取它们的文本字符串。它只是返回一个空字符串。

当我手动选择其中一个字符串并将其保存为 .txt 文件时,它是 1.32MB 或 1,393,557 字节。

当字符串短得多只有几万字节时,该正则表达式成功匹配并获取它。

所以我的问题是,当我想到字符串 preg_match_all() 可以匹配的限制/最大长度时,它是什么以及如何将其设置得更大?

【问题讨论】:

  • 为什么不用DOM解析器来解析网页。
  • @anubhava,因为网页可能不合规?
  • 这更多是使用 DOM 的原因,因为 regex 更有可能破坏并产生意想不到的结果。
  • @kavoir.com:您认为正则表达式会更好地处理损坏的 HTML?正则表达式与 HTML 之类的语言一样糟糕。 PCRE 唯一的优点是它允许递归......但即使这样,如果 HTML 古怪或正则表达式没有仔细编写以避免一遍又一遍地匹配任何内容,它也会变得毛茸茸。
  • @kavoir.com: 任何时候你不能保证你收到的 HTML 的漂亮,一个诚实的 HTML 解析器通常会比一个正则表达式更有意义.举一个病态的例子,让我们以<!DOCTYPE html><title id="</title><h1><<a "></html></title><input value="<a id=wat class=" disabled>ehh"><a id="wat" href="</div>">stuff</a></html>为例。根据 W3C,这是有效的 HTML。一个像样的 HTML 解析器会用它做正确的事情。但是由于各种原因,许多正则表达式不知道该怎么做。

标签: php regex


【解决方案1】:

ini_set('pcre.backtrack_limit', '1048576'); 设置为您希望在脚本或php.ini 文件中全局使用的任何内容。 (示例为 1mb)

归功于:http://www.karlrixon.co.uk/writing/php-regular-expression-fails-silently-on-long-strings/

【讨论】:

  • 我实际上将它增加到 10485760(你的价值的 10 倍)来解决问题。这会带来任何记忆问题吗?越大,越慢还是什么?
  • @kavoir.com - 内存问题?是的!在这里要非常小心。将某些常见的正则表达式模式应用于长主题字符串很容易崩溃 PHP 和/或 apache 网络服务器可执行文件。 (不仅匹配失败,而且实际上由于堆栈溢出而生成 seg-fault。)发生这种情况是因为 PHP 设置:pcre.recursion_limit 远高于 PCRE 库的建议限制。请参阅我对RegExp in preg_match function returning browser error 的回答。祝你好运。
  • 除非您的可用内存很少(
猜你喜欢
  • 1970-01-01
  • 2021-01-28
  • 1970-01-01
  • 2017-03-12
  • 1970-01-01
  • 1970-01-01
  • 2010-12-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多