2010-10-20 136 views
1

我是一個正則表達式的新手,我需要一些幫助:)。「正則表達式」中的「未知」修飾符「c」是什麼意思?

我有這樣的:

$url = '<img src="http://mi.url.com/iconos/oks/milan.gif" alt="Milan">'; 
$pattern = '/<img src="http:\/\/mi.url.com/iconos/oks/(.*)" alt="(.*)"\>/i'; 

preg_match_all($pattern, $url, $matches); 

print_r($matches); 

而且我得到這個錯誤:

Warning: preg_match_all() [function.preg-match-all]: Unknown modifier 'c'

我想選擇 'milan.gif'。

我該怎麼做?

+3

如果您的輸入數據不同,您應該使用DOM解析器而不是正則表達式來提取'src':請參閱http://stackoverflow.com/questions/3577641/best-methods-to-parse-html – 2010-10-20 08:58:06

+1

你忘了逃脫。 – Hannes 2010-10-20 08:58:34

回答

5

如果您使用/作爲delimiter,你需要逃跑出現正則表達式內部的性格。你沒有:

/<img src="http:\/\/mi.url.com/iconos/oks/(.*)" alt="(.*)"\>/i 
          ^

這裏標記/作爲正則表達式的結束符,一切之後,被視爲modifier處理。 i是一個有效的修飾符,但c不是(請參閱您的錯誤消息)。

所以:

/<img src="http:\/\/mi\.url\.com\/iconos\/oks\/(.*)" alt="(.*)"\>/i 

但作爲佩卡在評論中已經指出的那樣,你不應該嘗試像HTML非正規語言使用正則表達式。改爲使用HTML解析器。看看Best methods to parse HTML

+1

不錯的一個。另一種方法是使用另一個分隔符,例如'#'... – 2010-10-20 09:08:06

1

問題是,你還沒有逃脫url字符串中的正斜槓(你已經逃過http://部分中的那些,但沒有url路徑)。

因此,它遇到它的第一個(這是後.com),它認爲是正則表達式的結束,所以它將該斜槓後面的所有內容視爲'修飾符'代碼。

下一個字符('i')是一個有效的修飾符(正如你知道的,因爲你實際上在你的例子中使用它),所以通過測試。然而,下一個字符('c')不是,所以它會拋出一個錯誤,這就是你所看到的。

要修復它,只需跳過斜線。所以你的例子看起來像這樣:

$pattern = '/<img src="http:\/\/mi.url.com\/iconos\/oks\/(.*)" alt="(.*)"\\>/i'; 

希望有幫助。

請注意,正如有人已經說過,通常不建議使用正則表達式來匹配HTML,因爲HTML可能太複雜,無法準確匹配。通常最好使用DOM解析器。在您的示例中,如果alt屬性或圖像URL的末尾包含意外字符,或者HTML代碼中的引用不符合您的預期,則該正則表達式可能會失敗。

相關問題