简单的正则表达式似乎在PHP中导致无限循环

时间:2014-06-26 15:27:25

标签: php regex

以下两行是我的代码:

$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内的换行符。

另外,如果我用{/ p>之类的东西替换file_get_contents函数

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

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

所以我理解RegEx在注意到包含换行符的字符串时遇到了问题吗?

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

2 个答案:

答案 0 :(得分:0)

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

那就是说,你不应该用正则表达式解析HTML。认真。 Bad things happen

答案 1 :(得分:0)

我放弃它:似乎问题是haystack变量$ rank_content的LENGTH。它的长度约为90,000,而正则表达式匹配()的最大允许长度约为30,000,所以我认为正则表达式替换()是相同的。 如果有人感兴趣的话,解决这个问题肯定是可能的:看一下这个链接 - > PHP preg_match_all limit

我自己将使用另一种方法来解决问题,这种方法可以读取HTML单元等网站的内容,也可以在线后检索网站。

相关问题
最新问题