【问题标题】:Parse anchor tags which have img tag as child element解析具有 img 标签作为子元素的锚标签
【发布时间】:2023-10-27 05:14:02
【问题描述】:

我需要找到所有具有img 标记作为子元素的锚标记。考虑以下情况,

<a href="test1.php">
 <img src="test1.jpg" alt="Test 1" />
</a>

<a href="test2.php">
 <span>
  <img src="test2.jpg" alt="Test 2" />
 </span>
</a>

我的要求是生成href 属性列表以及srcalt 即,

$output = array(
 array(
  'href' => 'test1.php',
  'src'  => 'test1.jpg',
  'alt'  => 'Test 1'
 ),
 array(
  'href' => 'test2.php',
  'src'  => 'test2.jpg',
  'alt'  => 'Test 2'
 )
);

如何在 PHP 中匹配上述情况? (使用 Dom Xpath 或任何其他 dom 解析器)

提前致谢!

【问题讨论】:

    标签: php domxpath domparser


    【解决方案1】:

    假设$doc 是代表您的HTML 文档的DOMDocument

    $output = array();
    $xpath = new DOMXPath($doc);
    # find each img inside a link
    foreach ($xpath->query('//a[@href]//img') as $img) {
    
        # find the link by going up til an <a> is found
        # since we only found <img>s inside an <a>, this should always succeed
        for ($link = $img; $link->tagName !== 'a'; $link = $link->parentNode);
    
        $output[] = array(
            'href' => $link->getAttribute('href'),
            'src'  => $img->getAttribute('src'),
            'alt'  => $img->getAttribute('alt'),
        );
    }
    

    【讨论】:

    • @NikhilMohan:抱歉,有点改变。您必须实际查询附加到文档的DOMXPath,而不是文档本身。
    • 没关系。我已经用你的第一篇文章修复了它:) 还有一件事,如何找到没有 img 标签作为子元素的锚标签(而不是 srcalt,我需要锚文本)?
    • 第一个猜测:查询//a[not(//img)] 以获取非图像链接,并从那里查询//text() 以获取这些链接中的每个文本节点。您可能应该将他们的nodeValues 收集到一个数组中并将它们内爆以获得整个文本值。
    • 刚刚尝试过...您需要查询//a[not(.//img)] 以获取链接。这个点显然很重要;没有它,表达式似乎意味着“任何&lt;a&gt;标签,但前提是上下文节点下没有图像”——并且上下文节点默认为整个文档。
    【解决方案2】:

    假设您的 HTML 是有效的 XML 文档(具有单个根节点等),您可以像这样使用 SimpleXML:

    $xml = simplexml_load_file($filename);
    $items = array();
    foreach ($xml->xpath('//a[@href]') as $anchor) {
        foreach ($anchor->xpath('.//img[@src][@alt]') as $img) {
            $items[] = array(
                'href' => (string) $anchor['href'],
                'src' => (string) $img['src'],
                'alt' => (string) $img['alt'],
            );
        }
    }
    print_r($items);
    

    这使用 xpath 在文档中搜索具有href 属性的所有&lt;a&gt; 标记。然后它在找到的每个&lt;a&gt; 标记下搜索,以找到同时具有srcalt 标记的任何&lt;img&gt; 标记。然后它只是抓取所需的属性并将它们添加到数组中。

    【讨论】:

      【解决方案3】:

      使用简单的 HTML DOM 解析器http://simplehtmldom.sourceforge.net/

      你可以做这样的事情(粗略的代码,你必须调整代码才能让它工作。):

       //include simple html dom parser
       $html = file_get_html('your html file here');
      
      foreach($html->find('a') as $data){
         $output[]['href']=$data->href;
         $output[]['src']=$data->src;
         $output[]['alt']=$data->alt;
      
      }
      

      【讨论】:

      • srcalt 属性位于链接内的图像上。