2012-10-28 129 views
0

我正在嘗試使用regex,它只匹配不以其他字符串開頭的字符串。據我所知,從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以及如何解決它?

+0

也許你可以使用一個額外的負狀態HTTP ://stackoverflow.com/questions/6869679/negative-rewrite-rule-for-redirecting-everything-thats-not-an-image – ziya

回答

2

這是因爲您不需要向前查看字符串的開頭。只需添加另一個錨:

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

否則,當然,發動機將無法匹配的第一個字符(因爲在先行踢),但隨後會很樂意嘗試從第二個字符相匹配。當然,xcludedpath...並沒有引起負面預測。

由於您rubular例子最後一個字符串以斜線開始,你可以添加一個可選的斜槓先行,如果要排除這兩種型號:

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

完美。謝謝! – user6669