2011-03-13 58 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();