我正在尝试在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 '|'
。
任何人都可以告诉我哪里出错了,我尝试了多种模式,但我做的事似乎没有用。
由于
答案 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*/>])