带有破折号和&符号的PHP Regexp不起作用

时间:2016-10-21 08:07:45

标签: php regex ampersand

这是一个字符串:

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

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

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

$string2 = 'Three';

所以我使用了preg_match_all但是我的regexp有问题:

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

有人可以解释一下为什么它不起作用..?我不明白我不尊重哪个'规则'..

1 个答案:

答案 0 :(得分:1)

+之后) ([-;\w\ \.\/\'\d\(\)\&]+)+} causes the catastrophic backtracking issue(请参阅more on this here),因为这是(a+)+类型的+类型不是结束子模式的模式。已删除explodesolves the issue

最后一个子模式有同样的问题,但由于内部PCRE优化而不会造成麻烦。

此外,我认为您不需要任何正则表达式,使用strip_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];

include $(CLEAR_VARS)
LOCAL_MODULE    := boost_atomic
LOCAL_SRC_FILES := ../dev/libcpp/boost/1.60.1/lib/libboost_atomic.a
include $(PREBUILT_STATIC_LIBRARY)

...

# boost import:
LOCAL_CPPFLAGS += -DHAVE_CONFIG_H -fexceptions -frtti
LOCAL_STATIC_LIBRARIES += boost_atomic

请参阅PHP demo