Php 解析将img标记作为子元素的锚定标记

Php 解析将img标记作为子元素的锚定标记,php,domxpath,domparser,Php,Domxpath,Domparser,我需要找到所有锚定标记,它们的子元素是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> 如何在PHP中匹配上述情况?(使用Dom

我需要找到所有锚定标记,它们的子元素是
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>
如何在PHP中匹配上述情况?(使用Dom Xpath或任何其他Dom解析器)


提前谢谢

使用简单的HTML DOM解析器

您可以这样做(粗略的代码,您必须调整代码以使其正常工作):


假设
$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'),
    );
}
$output=array();
$xpath=新的DOMXPath($doc);
#在链接中查找每个img
foreach($xpath->query('//a[@href]//img')作为$img){
#通过向上移动直到找到链接来查找链接
#因为我们只找到了$img->getAttribute('src'),
'alt'=>$img->getAttribute('alt'),
);
}

假设您的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
属性的所有
标记。然后在找到的每个
标记下搜索,以查找任何
alt
标记。然后它只需要获取所需的属性并将它们添加到数组中。

@NikhilMohan:对不起,有点变化。您必须实际查询附加到文档的
DOMXPath
,而不是文档本身。这没关系。我已经在你的第一篇文章中修复了它:)还有一件事,如何找到没有img标记作为子元素的锚定标记(而不是
src
alt
,我需要锚定文本)?首先猜测:query
//a[not(//img)]
获取非图像链接,然后从那里查询
//text()
,获取这些链接中的每个文本节点。您可能应该将它们的
节点值
收集到一个数组中,并对它们进行内爆以获得整个文本值。只要尝试一下……您就会想要查询链接的
//a[not(.//img)]
。圆点明显显著;如果没有它,表达式的意思似乎是“任何
标记,但只有在上下文节点下没有图像时”——上下文节点默认为整个文档。
src
alt
属性位于链接内的图像上。
$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'),
    );
}
$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);