【问题标题】:Simple regex seems to cause infinite loop in PHP简单的正则表达式似乎会导致 PHP 中的无限循环
【发布时间】:2023-03-15 09:26:01
【问题描述】:

以下两行是我的代码:

$rank_content = file_get_contents('https://www.championsofregnum.com/index.php?l=1&ref=gmg&sec=42&world=2');
$tmp_ = preg_replace("/.+width=.16.> /Uis", "", $rank_content, 1);

上面的第二行导致无限循环。 相反,以下替代方案确实有效:

$tmp_ = preg_replace("/.+width=.16.> /Ui", "", $rank_content, 1);
$tmp_ = preg_replace("/[^§]+width=.16.> /Uis", "", $rank_content, 1);

但遗憾的是,它们并没有给我想要的东西 - 两种选择都不包括 $rank_content 中的换行符。

另外,如果我将 file_get_contents 函数替换为类似

$rank_content = "asdfas\nasdfasdfaswidth=m16m> teststring";

也没有问题,虽然\n也代表换行,不是吗?!

那么我是否正确理解 RegEx 在注意到其中包含换行符的字符串时存在问题?

如何通过删除一些行直到出现"width="16" " 之类的内容来过滤$rank_content(其中包含多行)的子字符串? (可以在网站的源代码中看到)

【问题讨论】:

  • 不,\n 仅表示双引号字符串中的换行符。
  • {1} 在正则表达式中没用...
  • 谢谢,我编辑了这两期
  • 再次编辑 - s 而不是 m
  • 我在链接页面上没有看到任何与width=.16.> 匹配的内容。是不是搞错了?

标签: php regex


【解决方案1】:

m 修饰符替换为s 修饰符。 m 改变了^$ 的行为,而s 改变了. 的行为

也就是说,您不应该使用正则表达式解析 HTML。严重地。 Bad things happen.

【讨论】:

  • 是的,对不起,s 也是我在代码中使用的。编辑了,问题依旧。
  • 每个人总是链接到那个帖子,但永远不会链接到它下面的那个....stackoverflow.com/a/1733489/485418
  • 为什么我不应该使用正则表达式来从网站检索一些值?有更好的方法吗?
  • 编辑。我将看看 HTMLUnit 库。并不能解决问题。
【解决方案2】:

我放弃了:看来问题是 haystack 变量 $rank_content 的长度。它的长度约为 90,000,而 regex match() 允许的最大长度约为 30,000,所以我想 regex replace() 也是一样的。 如果有人感兴趣,解决这个问题肯定是可能的:看看这个链接 -> PHP preg_match_all limit

我自己将使用另一种读取网站内容的方法(如 HTML 单元)或逐行检索网站来解决问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多