2013-06-28 4 views
3

Мне нужно найти все теги привязки, которые имеют тег img как дочерний элемент. Рассмотрим следующие случаи,Разбирайте метки привязки, которые имеют тег 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 атрибутов вместе с src и alt т.е.

$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 или любого другого синтаксического анализатора)

Спасибо заранее!

ответ

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'), 
    ); 
} 
+0

Спасибо! Именно то, что я искал. –

+0

@NikhilMohan: Извините, немного изменился. Вы должны фактически запросить 'DOMXPath', прикрепленный к документу, а не сам документ. – cHao

+0

Всё нормально. Я исправил его с вашим первым сообщением :) Еще одна вещь, как найти теги привязки, которые не имеют тега img в качестве дочернего элемента (вместо 'src' и' alt', мне нужен якорный текст)? –

0

Использование Simple HTML DOM Parser http://simplehtmldom.sourceforge.net/

Вы можете сделать что-то вроде этого (Rough кодекс, вы должны настроить код, чтобы заставить его работать.):

//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; 

} 
+0

Атрибуты 'src' и' alt' находятся на изображении внутри ссылки. – cHao

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 теги. Затем он просто захватывает необходимые атрибуты и добавляет их в массив.

Смежные вопросы