2011-10-14 111 views
0

我使用PHP模式修飾符「U」來反轉preg_match()的默認貪婪行爲。但是,它不按我想要的方式工作。我的代碼:PHP preg_match()非常規匹配問題

$str = '<p> 
<div><a aaa 
    <a href="a.mov"></a> 
    </div> 
</p>'; 

$needle = "a.mov"; 

$pattern = "/\<a.*".preg_quote($needle, "/").".*\<\/a\>/sU"; 

preg_match($pattern, $str, $matches); 
print_r($matches); 

我想匹配

<a href="a.mov"></a> 

但是這一塊的代碼返回我

<a aaa 
    <a href="a.mov"></a> 

有人能擺脫我哪裏做錯了一些輕?

+0

您的$ matches變量不等於任何值,是嗎?如何在未初始化時打印它 – Grigor

+0

檢查了這一點:http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags然後重寫這個使用DOM操作而不是Regexes。您破碎的

+0

@Grigor:它由preg_match –

回答

2

那麼,在更廣泛的意義上說,你想用正則表達式解析HTML的時候,但對於您所提供的代碼片段沒有錯,問題是,ungreedy修飾符告訴*+{n,}儘快停止他們很高興,而不是一路走來。

因此,它實質上影響到匹配結束而不是開始的地方 - 「非常規」是而不是旨在表示「給我最短的」匹配成爲可能。

您可以使用mU修飾符而不是sU修復此特定示例,以便.不會與新行匹配。

+2

+1初始化/填充。 「貪婪」和「不貪婪」是錯誤的。如果我們稱他們爲「渴望」和「不情願」,我們可以防止這種混淆。看起來每個人都必須以艱苦的方式學習這門課。 (僅供參考,不需要添加'm'修飾符;只需刪除's'。) –