【问题标题】:Logical operator AND with php regular expression逻辑运算符 AND 与 php 正则表达式
【发布时间】:2011-11-22 22:00:55
【问题描述】:

我想在我的正则表达式中使用一种逻辑运算符“AND”。 我试过这个:

(?=exp1)(?=exp2)

但是在 PHP 中 ?= 不起作用,需要用 PHP 语言编写我的程序。还有其他方法吗?如果存在所有条件并且以任何顺序存在,则表达式必须匹配。 我不想把每一个排列都写成这样:

(exp1)(exp2)(exp3)|(exp1)(exp3)(exp2)|....

【问题讨论】:

标签: php regex preg-match logical-operators


【解决方案1】:

PHP 确实支持前瞻表达式。不过,您可能没有正确使用它们。

假设您要匹配包含foobarbaz 全部三个的字符串,则需要正则表达式

^(?=.*foo)(?=.*bar)(?=.*baz)

这将返回字符串foobarbazbarbazfoo 等的匹配。但是,该匹配将是空字符串(因为前瞻不消耗任何字符)。如果您希望正则表达式返回字符串本身,请使用

^(?=.*foo)(?=.*bar)(?=.*baz).*

如果它满足所有三个条件,它将匹配整个字符串。

我会简单地使用

if (preg_match('/^(?=.*foo)(?=.*bar)(?=.*baz)/s', $subject)) {
    # Successful match
} else {
    # Match attempt failed
}

请注意,这也将匹配foonly bartender bazooka 之类的字符串。如果你不想这样(只允许三个表达式中的每一个的纯排列),你可以用一个小技巧来做到这一点:

^(?:foo()|bar()|baz()){3}\1\2\3$

匹配 foobarbazfoobazbarbarfoobazbarbazfoobazfoobarbazbarfoo(仅此而已)。 “技巧”的灵感来自 Jan Goyvaerts 和 Steven Levithan 的优秀书籍 "Regular Expressions Cookbook"(第 304 页)。它的工作原理如下:

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

【讨论】:

  • @tim 你能提供资源或补充吗?我以前从未见过像 foo()|bar()|baz() 这样的东西。
  • 我猜,我要问的是空括号的意义是什么?
  • @bozdoz:我添加了解释和参考。
【解决方案2】:

除了@Tim 的回答:

(?=exp1)(?=exp2)

这不可能是真的。你用简单的英语说:确保这里后面的文本是 exp1,并确保这里后面的文本是 exp2。不可能这是真的。它永远不会匹配。

【讨论】:

    猜你喜欢
    • 2021-02-25
    • 2023-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多