匹配不以字符串开头的字符串

时间:2012-10-28 17:35:05

标签: regex apache2

我正在尝试发布regex,它只匹配不以其他字符串开头的字符串。据我所知,在Stack Overflow上some其他questions我应该使用负向前瞻断言。但由于某种原因,它似乎没有用。请考虑以下三个字符串:

/match.jpg
match.png
excludedpath/no-match.gif

我希望我的正则表达式模式只匹配前两个字符串,因为最后一个字符串以excludepath/开头。我试过的是以下内容:

(?!excludedpath\/)(.*)\.(gif|jpg|png)$

我想在Apache的重写规则中使用这个正则表达式模式。基本上我想简单地加载所有图像(带有这三个扩展名),除非它们的格式为http://example.com/excludedpath/some-image.jpg

RewriteCond %{REQUEST_FILENAME} (?!excludedpath\/)(.*)\.(gif|jpg|png)$
RewriteRule ^(.*)$ $1 [L]

RewriteCond "/my/path/to/application/%{REQUEST_URI}" !-f
RewriteRule ^(.*)$ /index.php/$1 [L]

任何人都可以告诉我为什么它仍匹配所有三个字符串:This Link以及如何修复它?

1 个答案:

答案 0 :(得分:2)

这是因为你不需要前瞻来查看字符串的开头。只需添加另一个锚:

^(?!excludedpath\/)(.*)\.(gif|jpg|png)$

否则,引擎当然会在第一个字符处无法匹配(因为前瞻开始),但是它会很乐意尝试匹配第二个字符。当然,xcludedpath...并没有引发消极的前瞻。

由于您的rubular示例的最后一个字符串以斜杠开头,因此如果要排除这两个变体,可以向前瞻添加可选的斜杠:

^(?!\/?excludedpath\/)(.*)\.(gif|jpg|png)$