PHP & Xpath: 获取所有一级 HTML 标签(所有兄弟)
PHP & Xpath: Get All The First Level HTML Tags (All Siblings)
我的函数需要从一部分 HTML 代码中获取所有第一级 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
有几处错误:
- 'figure' 没有显示
- 即使有多个兄弟姐妹,段落标签也会被挑出来
- 未找到第一个 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
);
}
记录:根据您的精确 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
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 代码中获取所有第一级 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
有几处错误: - 'figure' 没有显示 - 即使有多个兄弟姐妹,段落标签也会被挑出来 - 未找到第一个 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
);
}
记录:根据您的精确 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
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"