【发布时间】:2017-02-20 20:43:32
【问题描述】:
我下面有 2 个正则表达式,它们在 php 5.6 中有效,但如果字符 + 空格 > 1035 ish,则在 php 7.x 中无效。例如:[spoiler]1035 个 char + ws[/spoiler] 计数。我使用网站http://regexr.com/ 来测试带有http://pastebin.com/5bWzhNvy 的正则表达式,它似乎工作正常。
从PHP 7 regex not working the same way as in 5,我可以看到这个问题可能与正则表达式超时有关?但这里是代码,除非我弄错了。
// [spoiler]Text[/spoiler]
preg_match_all('/\[spoiler\]\s*((\s|.)+?)\s*\[\/spoiler\]/', $s, $matches, PREG_SET_ORDER);
foreach ($matches as $match) {
$id = substr(md5($match[1]), 0, 10) . mt_rand(0, 10000);
$s = str_replace($match[0],
'<a href="javascript:klappe_function(\'' . $id . '\')" style="color: #aaa" title="Open Spoiler"><img src="images/plus.png" id="pic' . $id . '" class="spoiler" alt="spoiler" /></a><div id="k' . $id . '" style="display: none;">' . $match[1] . '</div><br />',
$s);
}
// [spoiler=Heading]Text[/spoiler]
preg_match_all('/\[spoiler=(.+?)\]\s*((\s|.)+?)\s*\[\/spoiler\]/', $s, $matches, PREG_SET_ORDER);
foreach ($matches as $match) {
$id = substr(md5($match[2]), 0, 10). mt_rand(0, 10000);
$s = str_replace($match[0],
'<a href="javascript:klappe_function(\'' . $id . '\')" style="color: #aaa" title="Open ' . myhtmlentities($match[1], ENT_QUOTES) . '"><img src="images/plus.png" id="pic' . $id . '" class="spoiler" alt="spoiler" /> <b>' . $match[1] . '</b></a><div id="k' . $id . '" style="display: none;">' . $match[2] . '</div><br />',
$s);
}
【问题讨论】:
-
这并不奇怪,正则表达式是一团糟。如果您将
(\s|.)+?(“正则表达式性能杀手”)替换为.+?并使用/s修饰符,它已经变得更加高效,但仍然没有那么高效。 -
正则表达式搜索扰流标签内的任何文本,同时去除周围的空白。您可能更适合简单地捕获扰流器标签内的所有文本,然后将空格剥离作为单独的步骤
-
.已经与\s匹配,您的正则表达式可能运行缓慢并且超时,因为它进行了大量的回溯。 -
@WillBarnwell: 不完全匹配
.除了换行符之外的所有字符。 -
您应该使用
preg_replace_callback,而不是使用preg_match_all、foreach循环和str_replace。