Там может быть гораздо более простое решение. (возможно, используя что-то еще, кроме simple_html_dom)
Я не нашел подходящего селектора, а nextSibling () возвращает только следующий элемент . (Что немного странно. Simple_html_dom_node хранит два массива: $ children и $ node. Текстовые узлы находятся в $ узлов, но не в $ children. А next_sibling () работает с $ children).
Но поскольку $ node - это открытое свойство simple_html_dom_node, вы сами пишете итератор.
<?php
require_once 'simplehtmldom/simple_html_dom.php';
$html = str_get_html('<html><head><title>...</title></head><body>
<div class="text_small">
<b>Adress:</b> 9 Hange Road<br>
<b>Phone:</b> 999641587484<br>
<b>Contact:</b> Alex<br>
<b>Meeting Time:</b> 12:00-13:00<br>
</div>
<div class="text_small">
<b>Adress:</b> 8 Hange Road<br>
<b>Phone:</b> 888641587484<br>
<b>Contact:</b> Bob<br>
<b>Meeting Time:</b> 13:00-14:00<br>
</div>
</body></html>');
foreach($html->find('div.text_small') as $div) {
$result = parseEntry($div);
foreach($result as $r) {
echo "'$r[name]' - '$r[text]'\n";
}
echo "========\n";
}
function parseEntry(simple_html_dom_node $div) {
$result = array();
$current = null;
for($i=0; $i<count($div->nodes); $i++) {
if ( HDOM_TYPE_ELEMENT===$div->nodes[$i]->nodetype) {
if ( !is_null($current) ) {
$result[] = $current;
$current = null;
}
if ('b'===$div->nodes[$i]->tag) {
$current = array('name'=>$div->nodes[$i]->text(), 'text'=>'');
}
}
else if (HDOM_TYPE_TEXT===$div->nodes[$i]->nodetype && !is_null($current)) {
$current['text'] .= $div->nodes[$i]->text();
}
}
if ( !is_null($current) ) {
$result[] = $current;
}
return $result;
}
печать
'Adress:' - ' 9 Hange Road'
'Phone:' - ' 999641587484'
'Contact:' - ' Alex'
'Meeting Time:' - ' 12:00-13:00'
========
'Adress:' - ' 8 Hange Road'
'Phone:' - ' 888641587484'
'Contact:' - ' Bob'
'Meeting Time:' - ' 13:00-14:00'
========
Пока кто-то еще не найдет более простое решение, вы можете использовать его в качестве отправной точки.