-6ren">
gpt4 book ai didi

php - 需要防止 PHP regex segfault

转载 作者:行者123 更新时间:2023-12-04 07:01:45 25 4
gpt4 key购买 nike

为什么会出现以下段错误,我该如何预防?

<?php

$str = ' <fieldset> <label for="go-to">Go to: </label> '
. str_repeat(' ', 10000)
. '<input type="submit" value="Go" /> </fieldset> </form>';

preg_match_all("@
</?(?![bisa]\b)(?!em\b)[^>]*> # starting tag, must not be one of several inline tags
(?:[^<]|</?(?:(?:[bisau]|em|strong|sup)\b)[^>]*>)* #allow text and some inline tags
[\?\!\.]+
@ix", $str, $matches);

?>

我相信它会导致......等待......堆栈溢出。

编辑:

以上是演示问题的模式的简化版本。一个更完整的版本:
@
</?(?![bisa]\b)(?!em\b)[^>]*> # starting tag, must not be one of several inline tags
(?:[^<]|</?(?:(?:[bisau]|em|strong|sup)\b)[^>]*>)* # continue, allow text content and some inline tags

# normal sentence ending
[\?\!\.]+ # valid ending characters -- note elipses allowed
(?<!\b[ap]m\.)(?<!\b[ap]\.m\.)(?<!digg this\!)(?<!Stumble This\!) # disallow some false positives that we don't care about
\s*
(?:&apos;|&\#0*34;|'|&lsquo;)?\s* # closing single quotes, in the unusual case like "he said: 'go away'".
(?:"|&quot;|&\#0*34;|&\#x0*22;|&rdquo;|&\#0*8221;|&\#x0*201D;|''|``|\xe2\x80\x9d|&\#0*148;|&\#x0*94;|\x94|\))?\s* # followed by any kind of close-quote char
(?=\<) # should be followed by a tag.
@ix

目的是找到似乎以有效英文句子结尾结尾的 html 块。我发现这种方法非常擅长区分“内容”文本(如文章正文)和“布局”文本(即导航元素)。然而,有时如果标签之间有大量空白,它就会爆炸。

最佳答案

我要尝试的第一件事是使所有量词都具有所有格并且所有组都是原子的:

"@</?+(?![bisa]\b)(?!em\b)[^>]*+>
(?>[^<]++|</?+(?>(?>[bisau]|em|strong|sup)\b)[^>]*+>)*+
[?!.]+
@ix"

我认为 Jeremy 是对的:并不是回溯本身让你丧命,而是正则表达式引擎必须保存的所有状态信息才能使回溯成为可能。正则表达式似乎是以这样的方式构建的,如果它不得不回溯,无论如何它都会失败。所以使用所有格量词和原子组,不要费心保存所有无用的信息。

编辑:为了允许句子结尾的标点符号,您可以在第二行添加另一个替代方案:
(?>[^<?!.]++|(?![^?!.\s<]++<)[?!.]++|</?+(?>(?>[bisau]|em|strong|sup)\b)[^>]*+>)*+

添加匹配一个或多个所述字符,除非它们是元素中的最后一个非空白字符。

关于php - 需要防止 PHP regex segfault,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1722453/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com