2013-08-28 40 views
0

獲取所有網址:假設我們有一些CSS我們$plain_css變量:從純CSS

.slide-pause { 
    cursor: url(http://example.com/img/bg/pause.png),url(http://example.com/img/bg/pause.png),auto; 
} 
.something { 
    background-image: url('http://example.com/img/bg/beautiful.png'); // We have Quotes here 
} 

我需要從這個CSS獲得的所有URL。

這是我正在努力做到這一點:

preg_match_all('!url\(\'?http://example.com/.*\)!', $plain_css, $matches); 

什麼$matches回報:

array 
    0 => 
    array 
    0 => string 'url(http://example.com/img/bg/pause.png),url(http://localhost/site/img/bg/pause.png)' 
    1 => string 'url(http://example.com/img/bg/beautiful.png)' 

我需要它返回:

array 
    0 => string 'url(http://example.com/img/bg/pause.png)' 
    1 => string 'url(http://example.com/img/bg/pause.png)' 
    2 => string 'url(http://example.com/img/bg/beautiful.png)' 

回答

3

你的greediness的受害者。 .*儘可能匹配。將其替換爲.*?以使其不太適合快速修復。或禁止從重複字符)(這通常是首選 - 這是更明確和更有效):

preg_match_all('!url\(\'?http://example.com/[^)]*)!', $plain_css, $matches); 

注意,你無法說服preg_match_all在一個普通數組返回的一切 - 你總是會得到一個嵌套數組(這對於capturing很重要)。但你可以簡單地從$matches[0]得到你想要的結果。

+0

謝謝,它的工作,關於捕獲的不錯的注意,不知道! – Hypn0tizeR

2

您需要讓你的重複量詞懶(默認爲貪婪):

preg_match_all('!url\(\'?http://example.com/.*?\)!', $plain_css, $matches); 

這裏唯一的變化就是我在*重複量詞後面加了一個問號。通常,重複是貪婪:也就是說,它們匹配儘可能多的字符(並且仍然滿足表達式)。在這種情況下,*量詞的貪婪消耗了輸入字符串中的url表達式。更改爲一個懶惰的量詞修復了這個問題。

另一種方式來處理,這是使用否定的字符類,而不是.元字符(它匹配任何換行符以外的):

preg_match_all('!url\(\'?http://example.com/[^)]*\)!', $plain_css, $matches); 
+0

謝謝,它工作! – Hypn0tizeR