Min*_*int 4 html php domdocument domxpath
我昨天问了这个问题,当时它正是我所需要的,但在处理一些实时数据时,我发现这并不是我所期望的那样.使用PHP的HTML DOMDocument解析HTML
它从HTML页面获取数据,但随后它也会删除捕获的文本块中的所有HTML标记,这不是我想要的.(我可能不想拿出一些标签,但不是全部,这可以在以后完成)
这是DOM的常见问题:如果要获取标记的内容及其所有子项的内容,则必须做更多的工作.
基本上,您必须遍历与XPath查询匹配的子节点,以获取其内容.
用户在DOMElement课堂手册页上注明了一个解决方案- 请参阅本说明.
将此解决方案集成到您已有的代码中应该为HTML字符串的声明提供类似于此的内容,并使用子标记:
$html = <<<HTML
<div class="main">
<div class="text">
<p>
Capture this <strong>text</strong> <em>1</em>
</p>
<p>
And some other <strong>text</strong>
</p>
</div>
</div>
HTML;
Run Code Online (Sandbox Code Playgroud)
并且,要从该HTML字符串中提取数据,您可以使用以下内容:
$dom = new DOMDocument();
$dom->loadHTML($html);
$xpath = new DOMXPath($dom);
$tags = $xpath->query('//div[@class="main"]/div[@class="text"]');
foreach ($tags as $tag) {
$innerHTML = '';
// see http://fr.php.net/manual/en/class.domelement.php#86803
$children = $tag->childNodes;
foreach ($children as $child) {
$tmp_doc = new DOMDocument();
$tmp_doc->appendChild($tmp_doc->importNode($child,true));
$innerHTML .= $tmp_doc->saveHTML();
}
var_dump(trim($innerHTML));
}
Run Code Online (Sandbox Code Playgroud)
唯一改变的是foreach循环的内容:$tag->nodeValue你必须迭代子元素,而不仅仅是使用它.
这给了我以下输出:
string '<p>
Capture this <strong>text</strong> <em>1</em>
</p>
<p>
And some other <strong>text</strong>
</p>' (length=150)
Run Code Online (Sandbox Code Playgroud)
这是<div>匹配的标记的全部内容,以及它的所有子标记 - 包括标记.
注意:手册的用户注释中经常有有趣的想法和解决方案;-)