3

我需要找到所有锚标签,它们有一个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 解析器)

提前致谢!

4

3 回答 3

3

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

$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'),
    );
}
于 2013-06-28T05:17:04.127 回答
0

使用简单的 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;

}
于 2013-06-28T05:15:29.080 回答
0

假设您的 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 在文档中搜索<a>具有href属性的所有标签。然后它在找到的每个<a>标签下搜索以找到任何<img>同时具有src和标签的alt标签。然后它只是抓取所需的属性并将它们添加到数组中。

于 2013-06-28T05:17:28.120 回答