PHP 带破折号和符号的正则表达式不起作用

PHP Regexp with dash and ampersand doesn't work

这是一个字符串:

$test =  '<a id="test">One &amp; -Two&nbsp;-&nbsp;Three</a>';

我想将这两个字符串捕获到 2 个不同的变量中,例如:

$string1 = 'One &amp; -Two';

$string2 = 'Three';

所以我使用了 preg_match_all 但我的正则表达式有问题:

preg_match_all('#([-;\w\ \.\/\'\d\(\)\&]+)+&nbsp;-&nbsp;([\w+\ \.\-]+)+#', $test, $matches);

有人可以向我解释为什么它不起作用..?我看不出哪个 'rule' 我不尊重这里..

+)(([-;\w\ \.\/\'\d\(\)\&]+)+)causes the catastrophic backtracking issue (see more on this here) as this is the case of a (a+)+ type of pattern that is not the ending subpattern. Removing that + already solves the issue.

最后一个子模式也有同样的问题,但不会因为内部 PCRE 优化而造成问题。

此外,我认为您在这里不需要任何正则表达式,使用 explodestrip_tags:

$test =  '<a id="test">One &amp; -Two&nbsp;-&nbsp;Three</a>';
$res = explode("&nbsp;-&nbsp;", strip_tags($test));
echo $res[0]. "\n" . $res[1];

PHP demo