Bel*_*sen 6 php regex preg-match logical-operators
我想在我的正则表达式中使用一种逻辑运算符"AND".我试过这个:
(?=exp1)(?=exp2)
Run Code Online (Sandbox Code Playgroud)
但在PHP ?=中不起作用,需要用PHP语言编写我的程序.还有另一种方法吗?如果存在所有条件且按任何顺序,则表达式必须匹配.我不想写每个排列,如:
(exp1)(exp2)(exp3)|(exp1)(exp3)(exp2)|....
Run Code Online (Sandbox Code Playgroud)
Tim*_*ker 10
PHP确实支持超前表达式.但是你可能没有正确使用它们.
假设您要匹配包含所有三个的字符串foo,bar并且baz您需要正则表达式
^(?=.*foo)(?=.*bar)(?=.*baz)
Run Code Online (Sandbox Code Playgroud)
这将返回匹配的字符串foobarbaz或barbazfoo等.然而,那场比赛将是空字符串(因为向前看符号不消耗任何字符).如果您希望正则表达式返回字符串本身,请使用
^(?=.*foo)(?=.*bar)(?=.*baz).*
Run Code Online (Sandbox Code Playgroud)
如果满足所有三个标准,它将匹配整个字符串.
我会简单地使用
if (preg_match('/^(?=.*foo)(?=.*bar)(?=.*baz)/s', $subject)) {
# Successful match
} else {
# Match attempt failed
}
Run Code Online (Sandbox Code Playgroud)
请注意,这也会匹配一个字符串foonly bartender bazooka.如果你不想那样(只允许三个表达式中每一个的纯排列),你可以用一个小技巧来做:
^(?:foo()|bar()|baz()){3}\1\2\3$
Run Code Online (Sandbox Code Playgroud)
比赛foobarbaz,foobazbar,barfoobaz,barbazfoo,bazfoobar和bazbarfoo(而不是其他)."诀窍"的灵感来自Jan Goyvaerts和Steven Levithan的优秀着作"正则表达谱"(第304页).它的工作原理如下:
foo等)之后是一个空的捕获组(),如果需要的部分已被匹配,它总是匹配.foobarbar,则该部分(?:foo()|bar()|baz()){3}将匹配,但\3失败,因此整个正则表达式失败.\1\2\3在字符串的末尾成功匹配,因为每个捕获组只包含空字符串.