Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 输入字符串中的几个额外字符使正则表达式无法匹配_Php_Regex - Fatal编程技术网

Php 输入字符串中的几个额外字符使正则表达式无法匹配

Php 输入字符串中的几个额外字符使正则表达式无法匹配,php,regex,Php,Regex,我有一个字符串,我对它运行正则表达式,但我得到一个错误 PHP: 这似乎取决于单词字符,而不是正斜杠。为什么有些角色在这里会有所不同?我能做什么呢?这些额外的字符使正则表达式引擎达到回溯步骤限制: var_dump(preg_last_error() === PREG_BACKTRACK_LIMIT_ERROR); // will return `true` 您的正则表达式几乎很短,看起来可能是对的,但事实上,它滥用了量词,这会导致失败。当它无法在一系列\w+/?模式的末尾匹配)时,它会尝试回

我有一个字符串,我对它运行正则表达式,但我得到一个错误

PHP:


这似乎取决于单词字符,而不是正斜杠。为什么有些角色在这里会有所不同?我能做什么呢?

这些额外的字符使正则表达式引擎达到回溯步骤限制:

var_dump(preg_last_error() === PREG_BACKTRACK_LIMIT_ERROR); // will return `true`
您的正则表达式几乎很短,看起来可能是对的,但事实上,它滥用了量词,这会导致失败。当它无法在一系列
\w+/?
模式的末尾匹配
时,它会尝试回溯到所有以前的子表达式,希望找到
。但这永远不会发生,嵌套的量化组和令牌使这个过程永远运行

解决方案是重构你的正则表达式来考虑这个问题:

modified:\s+((?>\w+\/?)+).*\)
我刚刚把第二个俘获群变成了原子群。原子组(顾名思义)不允许回溯到集群中。因此,如果它在匹配
\w+\/?
后找不到模式,它就不会返回到
\w+\/?
,这会导致早期失败

对该正则表达式的正确修改是将
*
替换为更严格的内容:

modified:\s+((?>\w+\/?)+)[^)\v]*\)

PHP代码:

preg_match_all('~modified:\s+((?>\w+/?)+)[^)\v]*\)~', $str, $matches);

这些额外字符使正则表达式引擎达到回溯步骤限制:

var_dump(preg_last_error() === PREG_BACKTRACK_LIMIT_ERROR); // will return `true`
您的正则表达式几乎很短,看起来可能是对的,但事实上,它滥用了量词,这会导致失败。当它无法在一系列
\w+/?
模式的末尾匹配
时,它会尝试回溯到所有以前的子表达式,希望找到
。但这永远不会发生,嵌套的量化组和令牌使这个过程永远运行

解决方案是重构你的正则表达式来考虑这个问题:

modified:\s+((?>\w+\/?)+).*\)
我刚刚把第二个俘获群变成了原子群。原子组(顾名思义)不允许回溯到集群中。因此,如果它在匹配
\w+\/?
后找不到模式,它就不会返回到
\w+\/?
,这会导致早期失败

对该正则表达式的正确修改是将
*
替换为更严格的内容:

modified:\s+((?>\w+\/?)+)[^)\v]*\)

PHP代码:

preg_match_all('~modified:\s+((?>\w+/?)+)[^)\v]*\)~', $str, $matches);

你有一些邪恶的量词,使它永远运行。这是灾难性回溯的一个很好的理由。请改为尝试
modified:\s+((?>\w++\/?)+)[^\v]*\)
。@revo:如果它经过测试,那么您可以添加一个答案,这样它也可以帮助其他人吗?您有一些邪恶的量词,使它永远运行。这是灾难性回溯的一个很好的理由。请尝试
modified:\s+((?>\w++\/?)+)[^\v]*\)
。@revo:如果它经过测试,那么您可以添加一个答案,以便对其他人也有帮助吗?感谢关于灾难性回溯的有趣链接。您的正则表达式不会捕获所有组,它会跳过没有
(新提交)的行后面的组
或similar@Nick因为它需要在同一行中找到
。请看OP的正则表达式。@Nick在编写正则表达式时,有太多的正则表达式提供了一些有用的提示,您可能想看一下。@Nick您在链接中使用的正则表达式不是我的。您将第二部分设置为可选,只需复制/粘贴此答案中的部分即可。但问题在于双引号。删除它们并使用单引号。我也将编辑我的答案以反映这一点。感谢关于灾难性回溯的非常有趣的链接。您的正则表达式不会捕获所有组,它会跳过没有
(新提交)
或similar@Nick因为它需要在同一行中找到
。请看OP的正则表达式。@Nick在编写正则表达式时,有太多的正则表达式提供了一些有用的提示,您可能想看一下。@Nick您在链接中使用的正则表达式不是我的。您将第二部分设置为可选,只需复制/粘贴此答案中的部分即可。但问题在于双引号。删除它们并使用单引号。我也将编辑我的答案以反映这一点。