2011-03-13 56 views
0

可能重複:
Xpath not behaving for me in parsing basic html如何使用正則表達式檢索DIV的內容?

我知道如何從靜態的名字一個div(即總是在整個頁面相同)獲取內容。然而,我的情況是「post_id_xxxxx」,這樣的事情:

<div id="post_id_12345">abc</div> 

<div id="post_id_67890">abc</div> 

<div id="post_id_31234">abc</div> 

我想提取「ABC」字符串,但似乎很難給我,因爲每一個div有不同的ID。

謝謝。

+1

你不知道。 [時段](http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454)。 – delnan 2011-03-13 22:03:24

+0

[Xpath不能在解析基本html時爲我工作](http://stackoverflow.com/questions/5249492/xpath-not-behaving-for-me-in-parsing-basic-html)。注意對接受答案的評論。如果您只是懶得使用搜索功能,您應該能夠找到很多其他重複項。 – Gordon 2011-03-13 22:13:18

回答

1

不要使用正則表達式解析HTML/XML。 HTML有一個html特定解析器可以利用的結構。看到這個經典鏈接:RegEx match open tags except XHTML self-contained tags

你應該嘗試一些PHP的解析器像domdocument

請勿使用本

這裏是一個正則表達式將匹配您指定的例子。它不適用於更復雜的結構(例如嵌套div)。你沒有真正指定你知道關於你的html結構的不變式,從這個例子中應該可以工作。您可以擴展此正則表達式來匹配更復雜的內容,但真正的解析器將更加健壯和簡單。

<div id="post_id_[0-9]{5}">(.*)</div> 
+0

關於DOMDocument,我嘗試過使用它,但每當我想在HTML文檔上使用它時都會拋出錯誤,如下所示: Warning:DOMDocument :: loadXML()[domdocument.loadxml]:實體'aacute'未定義警告:DOMDocument :: loadXML()[domdocument.loadxml]:打開和結束標記不匹配:實體中的腳本行48和腳本,行test.php中的行66:實體中行35:test.php中的第35行 在線10 – Matt 2011-03-13 22:17:29

+0

@Matt,因爲你使用它錯了。使用'loadHTML'和'libxml_use_internal_errors'。只需搜索DOM和PHP即可。你所有的UseCases都已經被回答過了。 – Gordon 2011-03-13 22:20:13

+0

不使用loadXML使用loadHTML,loadHTML方法應該對格式錯誤的html比較健壯,並且應該能夠將其更正爲可以解析(通常)的dom樹。 – 2011-03-13 22:21:15

1

這仍是可行的用正則表達式,如果它真的只有大約過於簡單化的情況下在你的榜樣:

preg_match('#<div\s[^>]*id="post_id_12345"[^>]*>(.*?)</div>#', $str, $m) 

但只要你嵌套在文檔中div或其他複雜的結構,您需要使用HTML解析器。爲了給你一個真正的例子,而不是通用的鏈接,使用phpQuery或QueryPath與:

print qp($html)->find("#post_id_12345")->text();