无法使用 PHP DomDocument 找到 img 元素

问题描述 投票:0回答:1

我发现一个奇怪的问题。

我通过 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" />
php wordpress dom
1个回答
0
投票
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
部分,这应该如何理解。但由于您似乎没有在任何地方使用该变量,因此可能也不会造成太大伤害。)

© www.soinside.com 2019 - 2024. All rights reserved.