ORing两个表达式时,使用OR(|)和PHP Regex

时间:2011-08-22 10:47:48

标签: php regex

我正在尝试在PHP中将两个正则表达式与OR条件组合在一起,以便在一次传递中找到两个不同的字符串模式。

我有这种模式[\$?{[_A-Za-z0-9-]+[:[A-Za-z]*]*}],它匹配像${product}${Product:Test}这样的字符串。

我有这种模式[<[A-Za-z]+:[A-Za-z]+\s*(\s[A-Za-z]+=\"[A-Za-z0-9\s]+\"){0,5}\s*/>],它匹配像<test:helloWorld /><calc:sum val1="10" val2="5" />这样的字符串。

然而,当我尝试将两种模式加入一个

[\$?{[_A-Za-z0-9-]+[:[A-Za-z]*]*}]|[<[A-Za-z]+:[A-Za-z]+\s*(\s[A-Za-z]+=\"[A-Za-z0-9\s]+\"){0,5}\s*/>]

所以我可以通过一次调用找到所有匹配的字符串

preg_match_all(REGEX_COMBINED, $markup, $results, PREG_SET_ORDER);

我收到以下错误消息Unknown modifier '|'

任何人都可以告诉我哪里出错了,我尝试了多种模式,但我做的事似乎没有用。

由于

2 个答案:

答案 0 :(得分:2)

在PHP中,正则表达式必须包含在分隔符中,例如/abc/~abc~。几乎任何ASCII标点字符都可以;在大多数情况下,它必须是两端的相同角色。例外情况是您使用()<>等“包围”字符时;然后他们必须正确配对。

使用原始正则表达式,方括号被用作正则表达式分隔符。将它们粘合在一起后,它不再起作用,因为编译器仍在尝试使用第一个]作为结束分隔符。

另一个问题是你试图使用方括号进行分组,这是错误的;你用圆括号。如果你看下面你会看到我在需要的地方用圆括号替换了方括号,但最简单的一对我简单地掉了下来;在该级别不需要分组。然后我添加~作为正则表达式分隔符。我还添加了i修饰符并摆脱了一些混乱。

~\$?\{[\w-]+(?::[a-z]*)*\}~i

~<[a-z]+:[a-z]+\s*(?:\s[a-z]+=\"[a-z\d\s]+\"){0,5}\s*/>~i

要合并正则表达式,只需从第一个正则表达式中删除结尾~i,从第二个正则表达式中删除开头~,然后用管道替换它们:

~\$?\{[\w-]+(?::[a-z]*)*\}|<[a-z]+:[a-z]+\s*(?:\s[a-z]+=\"[a-z\d\s]+\"){0,5}\s*/>~i

答案 1 :(得分:1)

尝试将两个条件包装在一组外部括号“(... | ...)”:

([\$?{[_A-Za-z0-9-]+[:[A-Za-z]*]*}]|[<[A-Za-z]+:[A-Za-z]+\s*(\s[A-Za-z]+=\"[A-Za-z0-9\s]+\"){0,5}\s*/>])

经过测试here and it seemed to work