2015-03-17 10 views
1

У меня есть список элементов, где мне нужно будет получить атрибут заголовка списка, URL-адрес ссылки и отображаемый текст ссылки, а также значение span каждого тега списка.DOM loadhtml извлекает узлы и дочерние узлы

<ul> 
<li class="testclass" title="Title 1 goes here"> 
<a href="http://examplelink1.com">List Text 1</a> 
<span>Second List Text 1</span> 
</li> 
<li class="testclass" title="Title 2 goes here"> 
<a href="http://examplelink2.com">List Text 2</a> 
<span>Second List Text 2</span> 
</li> 
</ul> 

Как извлечь каждый отдельный список тегов и его значения с Еогеасп (так как мне нужно вставить значения в БД MySQL впоследствии (каждое значение в другом поле дб).

До сих пор , я могу получить их только по отдельности:

<?php 
$doc = new DOMDocument(); 
@$doc->loadHTML($list); 
$imageTags = $doc->getElementsByTagName('a'); 
foreach($imageTags as $tag) { 
$link = $tag->getAttribute('href'); 
echo $link.'<br/>'; 
} 
?> 

И

<?php 
$doc = new DOMDocument(); 
@$doc->loadHTML($list); 
$imageTags = $doc->getElementsByTagName('li'); 
foreach($imageTags as $tag) { 
$link = $tag->getAttribute('title'); 
echo $link.'<br/>'; 
} 
?> 

Я нашел скрипт с XPath, но я не знаю, как применять его правильно, чтобы получить конкретные значения, мне нужно, и использовать их в заявлении MySQL:

<?php 
$dom = new DOMdocument(); 
@$dom->loadHTML($list); 
$xpath = new DOMXPath($dom); 
$elements = $xpath->query("//*"); 
foreach ($elements as $element) { 
echo "<p>". $element->nodeName. "</p>"; 
$nodes = $element->childNodes; 
foreach ($nodes as $node) { 
echo $node->nodeValue. "<br/>"; 
} 
} 
?> 

ответ

2

Использование DOMXPath::evaluate(). Он является частью ext/dom и позволяет использовать выражения XPath для извлечения узлов и значений из DOM.

$dom = new DOMDocument(); 
$dom->loadHtml($html); 
$xpath = new DOMXPath($dom); 

// use an xpath expression to fetch the li nodes 
foreach ($xpath->evaluate('//ul/li[@class="testclass"]') as $li) { 
    var_dump(
    [ 
     // this is a direct attribute of the li node, use dom method 
     'title' => $li->getAttribute('title'), 
     // more complex, use an xpath expression 
     'href' => $xpath->evaluate('string(a/@href)', $li), 
     // Cast the node to a string to return the text content 
     'link-text' => $xpath->evaluate('string(a)', $li), 
     // works for the span, too 
     'description' => $xpath->evaluate('string(span)', $li) 
    ] 
); 
} 

Выход:

array(4) { 
    ["title"]=> 
    string(17) "Title 1 goes here" 
    ["href"]=> 
    string(23) "http://examplelink1.com" 
    ["link-text"]=> 
    string(11) "List Text 1" 
    ["description"]=> 
    string(18) "Second List Text 1" 
} 
array(4) { 
    ["title"]=> 
    string(17) "Title 2 goes here" 
    ["href"]=> 
    string(23) "http://examplelink2.com" 
    ["link-text"]=> 
    string(11) "List Text 2" 
    ["description"]=> 
    string(18) "Second List Text 2" 
} 
+0

Wow это потрясающе! Спасибо! Есть ли способ отбросить только значения в чистом формате без массива? Я попробовал foreach ($ xpath как $ key => $ val) {echo $ val;}, но он не работает ... – rainerbrunotte

+0

ok Я нашел способ, просто нужно было эхо-атрибуты значения прямо без vardump! лол! спасибо за помощь! очень признателен! – rainerbrunotte

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