逻辑运算符AND与php正则表达式

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)

这将返回匹配的字符串foobarbazbarbazfoo等.然而,那场比赛将是空字符串(因为向前看符号不消耗任何字符).如果您希望正则表达式返回字符串本身,请使用

^(?=.*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,bazfoobarbazbarfoo(而不是其他)."诀窍"的灵感来自Jan Goyvaerts和Steven Levithan的优秀着作"正则表达"(第304页).它的工作原理如下:

  • 每个所需的部分(foo等)之后是一个空的捕获组(),如果需要的部分已被匹配,它总是匹配.
  • 因此,如果所有三个必需部分都匹配,则所有三个空捕获组都匹配.
  • 如果每个捕获组都参与了匹配,则以下反向引用才会成功.
  • 因此,如果字符串是foobarbar,则该部分(?:foo()|bar()|baz()){3}将匹配,但\3失败,因此整个正则表达式失败.
  • 但是,如果所有三个都参与了匹配,则\1\2\3在字符串的末尾成功匹配,因为每个捕获组只包含空字符串.