添加括号时preg_match失败

时间:2011-09-05 08:25:58

标签: php regex preg-match

以下是我正在使用的正则表达式的简化。在我的开发机器上,$pattern1$pattern2都返回一个匹配项,但是在我的生产机器上只有$pattern1返回一个匹配项!显然,$pattern1$pattern2之间的唯一区别是其中一个在一个单词周围有括号。但是两者都是有效的模式,应该与给定的草垛相匹配(据我所知)。

$pattern1 = '/\<a name="ERROR TEXT"\>\<\/a\>\s*?validated\s*?\<\/span\>\s*?\<\/h1\>/';
$pattern2 = '/\<a name="ERROR TEXT"\>\<\/a\>\s*?(validated)\s*?\<\/span\>\s*?\<\/h1\>/';
$haystack = '- IFCS msg value, BOOKMARKED AS ERROR TEXT -->
          <a name="ERROR TEXT"></a>
             validated</span>
       </h1>

                <!-- START: .formActionHolder -->
                <div class="formActionHolder">';
preg_match($pattern1, $haystack, $matches);
print_r($matches);

以前有人发现过这个问题吗?请注意,这不是整个正则表达式 - 这是一个简化版本,我已经确定是问题。在我的实际代码中,'validated'的值不是常量 - 因此我使用括号来捕获单词的原因。当然,模式在括号内也有其他字符,这样我就可以在这里捕获变量字。这只是一个简单的例子,它解决了我遇到的两个看似很好的正则表达式的问题。

在我的开发机器上我使用php5.3.2和pcre 7.8库,在我的生产机器上我使用php5.2.4和pcre 7.4。

3 个答案:

答案 0 :(得分:0)

括号用于在php正则表达式中进行分组,并按照这样的方式进行操作,除非你将它们转义为使它们自己充当角色。

答案 1 :(得分:0)

你确定$ pattern 2无法匹配吗?在我的eclipse中,它匹配,显示Array([0] =&gt;验证 [1] =&gt;已验证)

答案 2 :(得分:0)

我想到?(中的$pattern2组合,所以我删除了?来制作

$pattern = '/\<a name="ERROR TEXT"\>\<\/a\>\s*(validated)\s*?\<\/span\>\s*?\<\/h1\>/';

这有效!!它非常奇怪 - 甚至可能是一个错误?

所以看起来?(validated)位被解释为条件子模式,而不是用于使\s*不合适的问号

对我来说看起来不正确。

好吧......从现在我的*贪婪开始,它有点痛苦。正则表达式模式在这个例子中做了我想要的但是......

感谢所有有用的评论!