正则表达式匹配的东西,不匹配的东西

时间:2010-10-23 15:26:01

标签: regex nginx

我想要一个nginx位置指令,它将所有网址与“xyz”匹配,但不匹配“.php”

我试过这个

location ~* /(.*)xyz/(.*)(?!\.php)(.*)$ {}

但是例如它似乎总是匹配/ xyz / 1和/xyz/1.php但它应该只匹配/ xyz / 1

5 个答案:

答案 0 :(得分:2)

您应该更具体地说明该位置的开头和结尾。如果.php不应出现在该位置的末尾,请将$放入预见断言中:

location ~* /(.*)xyz/(.*)(?!.*\.php$)(.*)$ {}

如果xyz应该是正确的路径段和第一个路径段(因此它必须以/xyz/开头),请使用:

location ~* ^/xyz/(?!.*\.php$)(.*)$ {}

答案 1 :(得分:1)

如果没有单独的正则表达式检查以确保“.php”不存在,我认为你不能这样做。问题是像.*这样的结构会吞噬足够多的字符,以确保你的负向前瞻永远不会适用。

答案 2 :(得分:1)

嗯,正如迈克尔所说的那样。*? (注意'?')会使搜索变得非贪婪,并且可以正常工作。

......或者,你可以尝试(而不是hackish):

[^.][^p][^h][^p]

可能有效,可能不会......它肯定是一种黑客攻击。

答案 3 :(得分:1)

这个很简单,但很难看到。正则表达式中的第二个(。*)是“贪婪的”,因此,它将捕获包括“.php”在内的所有内容,因此,对于解析器的“眼睛”,它之后没有“.php”(它已经通过)和结果是匹配。 :(

只需将第二个。* lazy改为。*?它会解决你的问题:

location ~* /(.*)xyz/(.*?)(?!\.php)(.*)$ {}

我建议你阅读this article,它以比我更好的方式解释它:D

答案 4 :(得分:0)

谢谢大家,我们终于想出了这个

location ~* ^/xyz([^.]*)/([^.]*)$ {
            rewrite  ^/xyz([^.]*)/([^.]*)$ /xyz$1/index.php/$2 last;
}

它有效。