2013-04-27 1 views
3

Есть ли способ захватить все элементы с идентификатором, который частично совпадает. Например, если я хочу захватить все HTML-элементы на веб-странице с атрибутом id, который начинается с msg_, но может быть чем-то после этого.PHP DomDocument - getElementByID (частичное совпадение) Как?

Вот что я так далеко:

$doc = new DomDocument; 

// We need to validate our document before refering to the id 
$doc->validateOnParse = true; 
$doc->loadHtml(file_get_contents('{URL IS HERE}')); 
foreach($doc->getElementById('msg_') as $element) { 
    foreach($element->getElementsByTagName('a') as $link) 
    { 
     echo $link->nodeValue . "\n"; 
    } 
} 

Но мне нужно, чтобы выяснить, как сделать частичное совпадение с идентификатором с этим битом: $doc->getElementById('msg_') или если есть какой-то другой способ сделать это ... ??

В принципе, мне нужно, чтобы захватить все «а» метки, которые являются потомками элемента с идентификатором, начиная с msg_ Технически всегда, только будет 1 a тег, но я не знаю, как захватить только первый ребенок, поэтому я также использую foreach.

Возможно ли это с классом PHP DomDocument?

Вот код, я использую в настоящее время, который не работает либо:

$str = ''; 
$filename = 'http://dream-portal.net/index.php/board,65.0.html'; 
@set_time_limit(0); 

$fp = fopen($filename, 'rb'); 
while (!feof($fp)) 
{ 
    $str .= fgets($fp, 16384); 
} 
fclose($fp); 

$doc = new DOMDocument(); 
$doc->loadXML($str); 

$selector = new DOMXPath($doc); 

$elements = $selector->query('//row[starts-with(@id, "msg_")]'); 

foreach ($elements as $node) { 
    var_dump($node->nodeValue) . PHP_EOL; 
} 

HTML выглядит следующим образом (это в span теге):

<td class="subject windowbg2"> 
<div> 
    <span id="msg_6555"> 
    <a href="http://dream-portal.net/index.php?topic=834.0">Poll 1.0</a> 
    </span> 
    <p> 
    Started by 
    <a href="http://dream-portal.net/index.php?action=profile;u=1" title="View the profile of SoLoGHoST">SoLoGHoST</a> 
    <small id="pages6555"> 
     « 
     <a class="navPages" href="http://dream-portal.net/index.php?topic=834.0">1</a> 
     <a class="navPages" href="http://dream-portal.net/index.php?topic=834.15">2</a> 
     » 
    </small> 

         with 963 Views 

    </p> 
</div> 
</td> 

Это <span id="msg_ часть, и есть куча этих (по крайней мере 15 на HTML-странице).

+0

Не загружать HTML с loadXML(), используйте loadHTML() –

+0

Спасибо, что, кажется, избавившись от ошибок, однако, все еще пусто ... –

+0

Тогда я бы предложил опубликовать часть HTML. –

ответ

4

Используйте это:

$str = file_get_contents('http://dream-portal.net/index.php/board,65.0.html'); 

$doc = new DOMDocument(); 
@$doc->loadHTML($str); 

$selector = new DOMXPath($doc); 

foreach ($selector->query('//*[starts-with(@id, "msg_")]') as $node) { 
    var_dump($node->nodeValue) . PHP_EOL; 
} 

дает вам:

string(8) "Poll 1.0" 
string(12) "Shoutbox 2.2" 
string(24) "Polaroid Attachments 1.6" 
string(24) "Featured News Slider 1.3" 
string(17) "Image Resizer 1.0" 
string(8) "Blog 2.2" 
string(13) "RSS Feeds 1.0" 
string(19) "Adspace Manager 1.2" 
string(21) "Facebook Like Box 1.0" 
string(15) "Price Table 1.0" 
string(13) "SMF Links 1.0" 
string(19) "Download System 1.2" 
string(16) "[*]Site News 1.0" 
string(12) "Calendar 1.3" 
string(16) "Page Peel Ad 1.1" 
string(20) "Sexy Bookmarks 1.0.1" 
string(15) "Forum Staff 1.2" 
string(21) "Facebook Comments 1.0" 
string(15) "Attachments 1.4" 
string(25) "YouTube Channels 0.9 Beta" 
+0

Да, но как загрузить внешний HTML-файл из пути URL в 'XPath'? Могу ли я просто сделать:' $ doc-> loadXML (file_get_contents ('{URL IS HERE}')); Мне нужно преобразовать HTML в XML правильно? –

+0

Использовать '$ str = file_get_contents ($ your_url);' – hek2mgl

+0

Это не работает, проверено и я ничего не получаю, просто пустой контент. –

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