我发现一个奇怪的问题。
我通过 PHP DOMDocument 解析 WordPress 帖子内容并仅打印 img 元素,如下所示:
function myfun($post_id)
{
// Get the post conent
$post = get_post($post_id);
$body = $post->post_content;
// Parse the post content with as UTF-8
// Ref: https://www.php.net/manual/en/intro.dom.php
$doc = new \DOMDocument();
$doc->loadHtml("<html><head><meta charset=\"UTF-8\"><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"></head><body>".$body."</body></html>");
// Enumerate the DOM tree
$doc_root = $doc->documentElement;
enum_dom($doc_root->childNodes, 0);
}
function enum_dom($nodes, $level)
{
foreach ($nodes AS $item)
{
if (($item->nodeType == XML_ELEMENT_NODE) && ($item->nodeName == 'img'))
{
print $item->nodeName . PHP_EOL;
if($item->childNodes || $item->childNodes->lenth > 0)
{
enum_dom($item->childNodes, $level+5);
}
}
}
}
但是这样的话,代码就不会输出任何img元素。但是,如果我删除
($item->nodeName == 'img')
,那么所有元素都会被打印出来,包括 img 元素。
既然img在DOM中,为什么我不能用条件过滤它
($item->nodeName == 'img')
以下是我用于测试的WordPress帖子内容:
<img class="aligncenter wp-image-43154" title="Excel Invoice Template Site Introduction" src="https://www.sample.com/blogs/wp-content/uploads/2024/04/excel-invoice-template-site-introduction.jpg" alt="Excel Invoice Template Site Introduction" width="600" height="338" />
enum_dom($doc_root->childNodes, 0);
根元素的两个子节点是
head
和body
。它们的节点名称都不是 img
。因此,递归调用
enum_dom($item->childNodes, $level+5);
永远不会发生,因为你把它放在if里面,检查当前元素的nodeName是否是
img
。
无论当前元素是否为
img
,都需要进行递归调用:
function enum_dom($nodes, $level)
{
foreach ($nodes AS $item)
{
if (($item->nodeType == XML_ELEMENT_NODE) && ($item->nodeName == 'img'))
{
print $item->nodeName . PHP_EOL;
}
if($item->childNodes || $item->childNodes->lenth > 0)
{
enum_dom($item->childNodes, $level+5);
}
}
}
(不确定
$level+5
部分,这应该如何理解。但由于您似乎没有在任何地方使用该变量,因此可能也不会造成太大伤害。)