2015-03-24 2 views
0

Привет, ребята у меня есть этот HTML код:Получение элемента внутри другого элемента с помощью класса PHP DOMDocument

<div class="post-thumbnail2"> 
    <a href="http://example.com" title="Title"> 
     <img src="http://linkimgexample/image.png" alt="Title"/> 
    </a> 
</div> 

Я хочу, чтобы получить значение Src изображения (http://linkimgexample/image.png) и значение HREF ссылки (http://example.com) Использование PHP DOMDocument

, что я сделал, чтобы получить ссылку на что-то вроде этого:

$divs = $dom->getElementsByTagName("div"); 

    foreach($divs as $div) { 
     $cl = $div->getAttribute("class"); 

     if ($cl == "post-thumbnail2") { 
      $links = $div->getElementsByTagName("a"); 
      foreach ($links as $link) 
        echo $link->getAttribute("href")."<br/>"; 
     } 
    } 

я мог бы сделать то же самое для Src IMG

$imgs = $div->getElementsByTagName("img"); 
foreach ($imgs as $img) 
    echo $img->getAttribute("src")."<br/>"; 

но когда-то на сайте нет изображений и кода Html как то:

<div class="post-thumbnail2"> 
    <a href="http://example.com" title="Title"></a> 
</div> 

поэтому мои вопросы, как я мог бы получить значение 2 в то же время это означает, что при наличии нет изображения я показать некоторые сообщения

, чтобы быть более ясным, что это пример:

<div class="post-thumbnail2"> 
     <a href="http://example1.com" title="Title"> 
      <img src="http://linkimgexample/image1.png" alt="Title"/> 
     </a> 
    </div> 
<div class="post-thumbnail2"> 
     <a href="http://example2.com" title="Title"></a> 
</div> 
<div class="post-thumbnail2"> 
     <a href="http://example3.com" title="Title"> 
      <img src="http://linkimgexample/image2.png" alt="Title"/> 
     </a> 
</div> 

я хочу, чтобы результат

http://example1.com - http://linkimgexample/image1.png 
http://example2.com - there is no image here ! 
http://example3.com - http://linkimgexample/image2.pn 

ответ

2

DOMElement::getElementsByTagName возвращает DOMNodeList, это означает, что вы можете узнать, если img -элементное был найден путем проверки length собственности.

$imgs = $div->getElementsByTagName("img"); 
if($imgs->length > 0) { 
    foreach ($imgs as $img) 
     echo $img->getAttribute("src")."<br/>"; 
} else { 
    echo "there is no image here!<br/>"; 
} 

Вы должны думать об использовании XPath - это делает вашу жизнь обходе DOM немного проще:

$doc = new DOMDocument(); 
if($doc->loadHtml($xmlData)) { 
    $xpath = new DOMXPath($doc); 
    $postThumbLinks = $xpath->query("//div[@class='post-thumbnail2']/a"); 

    foreach($postThumbLinks as $link) { 
     $imgList = $xpath->query("./img", $link); 

     $imageLink = "there is no image here!"; 

     if($imgList->length > 0) { 
      $imageLink = $imgList->item(0)->getAttribute('src'); 
     } 

     echo $link->getAttribute('href'), " - ", $link->getAttribute('title'), 
      " - ", $imageLink, "<br/>", PHP_EOL; 
    } 
} else { 
    echo "can't load HTML document!", PHP_EOL; 
} 
+0

Спасибо большое! когда я использую XPath, я не получаю imageLink, я все еще пытаюсь заставить его работать, не могли бы вы объяснить мне эту часть: В чем разница между $ imgList = $ xpath-> query ("// img", $ link); и $ imgList = $ xpath-> query ("./ img", $ link); – xochn

+0

Ну '// img' возвращает рекурсивно все элементы изображения под корнем документа, что, вероятно, не является тем, что вы хотите, поскольку это означает, что $ imageLink всегда указывает на src первого элемента' 'в вашем документе. Вероятно, вы захотите использовать '.// img' (обратите внимание на точку в начале, которая обозначает текущий узел), которая ищет элементы img под текущим узлом (который предоставляется через второй параметр' query'). './img' возвращает только те элементы img, которые являются прямыми дочерними элементами a-элемента. – vstm

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