2010-07-19 18 views
0

我需要DIV CLASS = 「父」 使用的preg_match的所有內容,如何preg_match父div?

<div class = "parent"> 

    <div id = "child1"> 
    </div> 

    <div id = "child2"> 
    </div> 

</div> 

有人嗎?

+1

另一個試圖用正則表達式解析HTML的人... [呃-oh](http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454)... – quantumSoup 2010-07-19 03:06:26

+1

看到#1回答:http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags – 2010-07-19 03:11:36

+0

這實際上是一個練習由我的導師給出。我們正在使用正則表達式atm。 – Karl 2010-07-19 03:27:02

回答

2

正確的做法是使用the DOMxpath來定位您嘗試提取的特定元素和屬性。然而,因爲這是作業,讓我們教導你的老師。

鑑於確切字符串,這個正則表達式將工作:!<div class = "parent">(.+)</div>!s

的關鍵是 「s」 修飾符。它將「.」字符從「除換行符之外的任何內容」變爲「包括換行符在內的任何內容」。

但是,如果空間在=附近被移除,則會中斷。如果有更多的屬性,它會中斷。如果有更多的類名,這會中斷。換句話說,這是處理HTML 有史以來最差的方法

地獄,如果HTML看起來像這樣,它會破壞:

<div> 
    <div class = "parent"> 
     My spoon is too big! 
     <div> 
      I am a banana! 
     </div><!-- Matches when un-greedy --> 
    </div> 
</div><!-- Matches when greedy --> 

爲什麼?因爲.+就是所謂的「貪婪」。它會匹配所有可能的東西,直到下一個條款。這意味着它可以匹配從div.parent到貪婪評論的所有內容。雖然可以通過添加問號(.+?)使其變得非貪婪,但它會匹配第一個可能的下一個子句,而不是最後一個可能的下一個子句。這意味着它可以匹配div.parent和un-greedy評論中的所有內容。

由於嵌套問題,正則表達式是解析HTML的非常糟糕的工具。我在這裏向您展示的問題只觸及了等待您的hohlsrr̪̖̠̖̤̊̾ͣͦr̪̖̠̖̤̊̾ͣͦo̪̖̠̖̤̊̾ͣͦs̠̏̊͠的表面。

請儘可能使用真正的HTML/XML解析器並使用生成的DOM。它會保存你的理智。

+0

+1用於解釋's'修飾符。最近這一直是我的一個問題,我忘記了如何解決它! – 2010-07-19 04:39:35

+0

好的非常感謝。 – Karl 2010-07-19 05:25:39

0

你的目的,這可能會做,但它不是沒有問題(如鏈接說明):

preg_match('/<div class = \'parent\'>(.*)<\/div>/s',$input,$matches); 

後,$比賽[0]將包含匹配的文本(包括父div),$ matches [1]僅包含內部項目。

+0

非常感謝guyz。 – Karl 2010-07-19 06:06:44

0

你最終像這樣野蠻:

/<div[^>]+class ?= ?"parent"[^>]*>(\s*(?:<div.*<\/div>\s*)*)<\/div>/Us 

首先,對於希望類的開放div標籤內的搜索 - 我喜歡用[^>]這是一個字符組指定任何東西,但「 >「字符。然後允許「=」(或不)的空格。

然後基本的想法是將每個隨後打開的div標籤與它的封閉配偶配對,以便能夠在正確的位置停下來。這是通過一個可以重複0次或更多次的非捕獲子模式完成的。注意這隻適用於一層嵌套。爲了解決這個問題,你需要遞歸,並且很難概念化。

遞歸版本將是這個樣子:

/<div[^>]+class ?= ?"parent"[^>]*>(\s*(<div.*(?2).*<\/div>\s*)*)<\/div>/Us 

總體來說,如果我不能做到理智的事情,並使用DOM我寧願通過串行走(從每次開機以前的匹配)爲每個打開的div標籤遞增一個計數器,併爲每個結束標籤遞減。

請注意,這些是我的頭頂,爲了學習正則表達式而不是用正則表達式解析html的想法是正常的。另外,我不希望看到正則表達式引擎必須通過平衡所有這些通配符的健美操記錄。