PHP&Xpath:获取所有第一级HTML标签(所有兄弟)
问题描述:
我的功能需要从HTML代码的一部分获得所有第一级HTML标签,以便我可以使用每个HTML代码。PHP&Xpath:获取所有第一级HTML标签(所有兄弟)
这是我的HTML文档总结如下:
<p>The breed was first...</p>
<p>Semencic credits his...</p>
<h1>Appearance</h1>
<p>The breed's distinctive...</p>
<p>It should be symmetrical...</p>
<figure id="attachment_6" style="width: 840px" class="wp-caption alignnone">
<img class="size-large wp-image-6" src="...jpg" alt="boerboel appearance" width="840" height="746">
<figcaption class="wp-caption-text">The dog appearance.</figcaption>
</figure>
<h1>Requirements</h1>
<p>Prospective owners....</p>
<p>These dogs....</p>
<h2>A Little Warning!</h2>
<p>If you are considering...</p>
<blockquote>
<p>According to...</p>
<p>Source: http://...</p>
</blockquote>
<p>Although more suitable...</p>
现在,我想我的输出是:
p
p
h1
p
p
figure
h1
p
p
h2
p
blockquote
p
但现在,它是:
h1
p
h1
p
h2
p
blockquote
p
有有几件事是错误的: - '图'没有显示 - 标准杆阿格拉夫标签单挑,即使有几个兄弟姐妹 - 第一p的都没有发现
$doc = new DOMDocument();
$doc->loadHTML($this->post_content, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);
$xpath = new DOMXpath($doc);
$nodes = $xpath->query("/*/*");
foreach ($nodes as $node) {
echo $node->nodeName;
echo '<br>';
$this->add_part(
md5($node->textContent),
$node->nodeName
);
}
答
DOM(libxml的)将重新格式化输入,所以它具有单个文档元素。如果删除解析器选项(LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD
),它将修复该html并添加html
和body
元素。所以,如果你想里面body
元素节点可以使用表达//body/*
$document = new DOMDocument();
$document->loadHtml($html);
$xpath = new DOMXpath($document);
foreach ($xpath->evaluate('//body/*') as $node) {
var_dump($node->nodeName);
}
输出:
string(1) "p"
string(1) "p"
string(2) "h1"
string(1) "p"
string(1) "p"
string(6) "figure"
string(2) "h1"
string(1) "p"
string(1) "p"
string(2) "h2"
string(1) "p"
string(10) "blockquote"
string(1) "p"
答
对于记录:您精确的HTML示例中,我得到这样的结果:
p/h1/p/p/figure/h1/p/p/h2/p/blockquote/p
代替这个(根据你的问题):
h1/p/ h1/p/ h2/p/blockquote/p
所以,我不知道这个答案是否能解决你的问题在真正的代码。
HTML有一些规则。您尝试处理没有根元素的代码。总结的东西你的代码像<body>
:
$doc->loadHTML("<body>$txt</body>", LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);
通过这种方式,我得到你想要的结果:
p
p
h1
p
p
figure
h1
p
p
h2
p
blockquote
p
+0
如果这个解决方案不起作用,您可以打印' - > post_content'并向我们展示结果(从页面源中复制它,而不是从渲染的页面或检查器复制)? – fusion3k
我认为你必须发布真实的HTML代码。您的代码适用于我,使用由标签包装的HTML样本。 – fusion3k
我的html代码是真正的html代码,没有标签包装所有这一切。 – Lazhar