以下是我正在使用的正则表达式的简化。在我的开发机器上,$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。
答案 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*
不合适的问号
对我来说看起来不正确。
好吧......从现在我的*
贪婪开始,它有点痛苦。正则表达式模式在这个例子中做了我想要的但是......
感谢所有有用的评论!