正则表达式匹配包含子字符串但不包含子字符串的字符串

时间:2013-03-07 17:35:43

标签: php regex

我正在尝试编写一个匹配包含某个子字符串的字符串的正则表达式,但如果它还包含不同的子字符串则会失败。我找到了this answer,但我不确定如何让它满足我的需求。为了尽可能具体:

  • 是的,必须将此作为表达式的一部分。我无法访问将要处理此代码的代码。
  • 是的,它需要是一个表达。
  • 它需要使用PHP的正则表达式风格。我很确定它正在使用preg进行评估

为了了解我正在尝试做什么,我有一组我想要过滤的网址。我希望匹配其中包含“/ somedir”的网址,但如果网址中也包含“somestring”,我不希望它匹配。

所以,

  • www.somesite.com/somedir/index.html
  • www.somesite.com/somedir/somotherdir/index.html
  • www.somesite.com/somedir/somepage.html

会全部匹配,但是,

  • www.somesite.com/somedir/somestring.html
  • www.somesite.com/somedir/somestring/index.html

都会失败。

1 个答案:

答案 0 :(得分:0)

如果没有其他模式包围,您需要一个只接受某个模式 的正则表达式:

~
    (?(DEFINE)
        (?<ACCEPT> must-contain-pattern)
        (?<REFUSE> must-not-contain-pattern)
    )

    ^
        (?:(?!(?&REFUSE)).)*
            (?&ACCEPT)
        (?:(?!(?&REFUSE)).)*
    $
~ux

DEFINE块中根据您的需要定义ACCEPTREFUSE模式,这应该可行。

编辑:通过定义两个命名的子模式,为您的案例量身定制的模式:

~
    (?(DEFINE)
        (?<ACCEPT> \Q/somedir\E)
        (?<REFUSE> \Qsomestring\E)
    )

    ^
        (?:(?!(?&REFUSE)).)*
            (?&ACCEPT)
        (?:(?!(?&REFUSE)).)*
    $
~ux