2013-03-07 110 views
0

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

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

为了说明我正在尝试做什么,我有一组我想要过滤的URL。我想匹配其中包含“/ 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

为什么正则表达式? “strpos”的简单组合将起作用。 – Tchoupi 2013-03-07 17:37:39

+0

*“我很确定它正在使用preg进行评估”* - 在询问之前您应该知道,因为它不同(很可能您是对的,但是,很好,找出;)) - 也是使用模式的代码是必要的,因为它可以区分使用正则表达式的方式。你也应该概述你到目前为止所尝试的。例如。模拟你自己的代码,提供数据运行,输出结果,使模式变成一个变量,然后尝试。 – hakre 2013-03-07 17:39:37

+0

http://stackoverflow.com/questions/2953039/regular-expression-for-a-string-containing-one-word-but-not-another – Crisp 2013-03-07 17:41:49

回答

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 
+0

这个问题看起来像很多工作,当问题的答案Crisp与作品相关时。除此之外,我不能使用多个表达式。 – AWarnock 2013-03-07 18:09:41

+0

很多工作?多个表达式?完全不是因为定义,这是一个表达式,而不是多个表达式。你可能不明白它是如何工作的,我通过编辑答案给你一个例子。这意味着你可以轻松采用它。那么希望它更清楚。 – hakre 2013-03-07 18:17:24

相关问题