如何在正则表达式中创建条件块

时间:2014-08-28 20:30:05

标签: php regex

我需要匹配每一行,如果该行有“event4”,那么也必须有“event70”或“event71”,如果它没有“event4”,也匹配它。使用常规表达。

输入:

event4,event56,event70
event5, event72
No event number
event4,event56

预期匹配的行:

event4,event56,event70
event5, event72
No event number

正则表达式:

preg_match( "/(?:event4,(.*(event70|event71)+)|.*)/", $text, $matches, PREG_OFFSET_CAPTURE);

现在匹配所有行。

2 个答案:

答案 0 :(得分:0)

使用(*SKIP)的方式:

/^(?:event4\b(*SKIP).*event7[01])?.*$/m

online demo

我假设事件已排序(event4始终在event70之前)。 如果event4并非总是在行的开头,则可以在模式的开头(锚点之后)添加.*?

工作原理:

(*SKIP)强制正则表达式引擎在右侧的子模式(.*event7[01])失败时不重试左侧匹配的字符。结果,如果未找到event70或event71,则下一次尝试将在“event4”之后开始,(并且会因为^锚点而到达换行时失败)

答案 1 :(得分:0)

试试这个:

preg_match_all('/(?(event4)(?(event7(0|1)).+)|.*)/', $text, $matches);