0

我正在尝试使用regex仅匹配不以其他字符串开头的字符串。据我所知以及 Stack Overflow 上的其他一些问题,我应该使用否定的前瞻性断言。但由于某种原因,它似乎不起作用。考虑以下三个字符串:

/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]

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

4

1 回答 1

2

这是因为您不需要先行查看字符串的开头。只需添加另一个锚点:

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

否则,引擎当然会在第一个字符处匹配失败(因为前瞻启动),但它会很乐意尝试从第二个字符匹配。当然xcludedpath...也不会引发负面的前瞻性。

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

^(?!\/?excludedpath\/)(.*)\.(gif|jpg|png)$
于 2012-10-28T17:38:02.990 回答