2011-03-31 46 views
2

我正在使用RegPattern來識別並捕獲CSS文件中的URL並追加版本標識符。這種模式大部分時間都適用。但是,其中一個打包的CSS文件正在破壞它。RegEx模式超出目標

url\((\""|\')?(?<path>(.*))?(\""|\')?\) 

當此塊CSS的使用:

.ui-widget-overlay { background: #252526 url(images/ui-bg_flat_0_252526_40x100.png) 50% 50% repeat-x; opacity: .50;filter:Alpha(Opacity=50); } 

它抓住了這一大塊文字:

url(images/ui-bg_flat_0_252526_40x100.png) 50% 50% repeat-x; opacity: .50;filter:Alpha(Opacity=50) 

這是在C#中被使用的替換方法的調用。

回答

1

你的問題是貪婪正則表達式。由於您的CSS中有另一個支架,因此它會使.*成爲整個版面。

使用此:

url\((\""|\')?(?<path>([^\)]+))?(\""|\')?\) 

我已經取代.*[^\)]+(你可以使用[^\)]*但我覺得URL不能爲空)=>所以它會發現,並非closin括號中的所有字符。

0

.*位是「貪婪」 - 它會匹配儘可能多的。而且因爲在該行後面還有一個右括號,可以讓它將第一個左括號計爲.*的一部分 - 它非常樂意做!

只要沒有一個網址在其中包含圓括號,請將.*更改爲[^)]*(您可能需要轉義它 - 不確定)應該處理所有事情。

希望這會有所幫助!

0

試試這個表達式:

url\([^)]+\)

1

最簡單的解決方法是使.*非貪婪通過後加入?.*

前:

url\((\""|\')?(?<path>(.*))?(\""|\')?\) 

後:

url\((\""|\')?(?<path>(.*?))?(\""|\')?\) 

請注意,最簡單的修復不一定是最有效的。

0

直接問題是你有錯誤的地方第二個問號。 (?<path>(.*))?的第一部分匹配任意字符中的零個或多個字符,並將它們保存在名爲「path」的組中,並且?使整個事件成爲可選項。你可能是想讓.*不貪心,你可以通過在羣組內移動問號來做到這一點:(?<path>.*?)(我也擺脫了不需要的內心羣體。)

但這仍然給你一個非常脆弱的正則表達式。它沒有考慮URL周圍的可選空白,並且可以通過URL中的引號或括號來欺騙它們,如果它們使用反斜槓進行轉義,則這些規則是合法的。你可能已經有相當長的一段時間了,但有很多完全合法的輸入不匹配,以及不匹配的非法輸入。其他人建議的(?<path>[^)]*)也是如此。

這裏有一個更強大的正則表達式:

Regex cssUrls = new Regex(@"(?i) 
    url\(\s* 
    (?> 
    ([""'])(?<path>(?>(?:(?!\1).)*))\1 
    | 
    (?<path>(?>(?:[^()'""\s]+|\\.)*)) 
) 
    \s*\) 
"); 

第一個選擇在引號中的URL匹配,確保開閉引號是同一類型。第二個備選方案與未加引號的URL匹配,可以包含轉義的括號,引號或空格。