zend regex route with negative lookahead

时间:2014-06-26 04:34:43

标签: regex zend-framework zend-route

我正在尝试在zend(1.11)中编写一个正则表达式路由,该路由匹配以/ foo结尾的URL,但如果它们以/ bar开头则不会 e.g。

/foo - match
/any/words/foo - match

/any/words - no match (doesn't end in /foo)
/any/words/barfoo - no match (doesn't end in /foo)
/bar/foo - no match (starts with /bar)
/bar/any/words/foo - no match (starts with /bar)

我的regext路线如下所示:

'^foo$|^(?!/bar/).+/foo$'

但我发现它匹配以/ foo结尾的任何内容,即使它以/ bar开头。

2 个答案:

答案 0 :(得分:1)

您需要一个否定的前瞻

幸运的是,我的口袋里有一个。试试这个:

^(?!/bar).*/foo$

查看符合in the demo的内容。

  • ^锚点断言我们位于字符串的开头
  • 否定前瞻(?!/bar)断言后面的内容不是/bar
  • .*匹配任何字符(点是除换行符之外的任何字符,星形重复零次或多次)
  • /foo匹配/foo
  • $锚点断言我们位于字符串的末尾

<强>参考

答案 1 :(得分:0)

最终解决方案:

'^foo$|^(?!bar).*/foo$'

<强>解释 正则表达式是一个红鲱鱼,这更像是一个问题。我的问题是传递给Zend的url字符串不包含前导斜杠,所以我正在针对错误的输入测​​试正则表达式。所以在我的解决方案中,我需要寻找'^ foo $'来匹配'/ foo'或'^(?!bar)。* / foo $'来匹配'/ any / words / foo'除了'/ bar / any /字/富”。

特别感谢@ zx81提供了惊人的快速和详细的响应,并帮助解除了我的想法。我建议阅读上面的回复以供参考。