如何通过simplehtmldom解析位于标签外部的文本片段(在标签之间)?

时间:2010-04-13 11:30:02

标签: php parsing

我正在使用simplehtmldom来解析html而且我一直在解析位于任何标记之外的明文(但是在两个不同的标记之间):

<div class="text_small">
 <b>Аdress:</b> 7 Hange Road<br>    
 <b>Phone:</b> 415641587484<br>    
 <b>Contact:</b> Alex<br>    
 <b>Meeting Time:</b> 12:00-13:00<br>
</div>

是否可以获得地址,电话,联系人,会议时间的这些值? 我想知道是否有机会将CSS选择器传递给nextSibling / previousSibling函数......

foreach($html->find('div.text_small') as $div_descr) 
 {
   foreach($div_descr->find('b') as $b) 
 {
 if ($b->innertext=="Аdress:") {//someaction
                }
 if ($b->innertext=="Phone:") { //someaction
                }
        if ($b->innertext=="Contact:") { //someaction
                }
        if ($b->innertext=="Meeting Time:") { //someaction
                }
    }
 }

我应该使用什么而不是“某些行动”?

UPD。是的,我没有编辑目标页面的权限。否则,它值得吗? :)

2 个答案:

答案 0 :(得分:2)

可能有一个更简单的解决方案。 (也许使用除了simple_html_dom之外的其他东西)

我没有找到合适的选择器,而nextSibling()只返回下一个兄弟元素。 (这有点奇怪.simple_html_dom_node存储两个数组,$ children和$ nodes。文本节点在$节点中但不在$ children中。而next_sibling()在$ children上运行。) 但由于$ nodes是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'
========

在其他人找到更简单的解决方案之前,您可能希望将此作为起点。

答案 1 :(得分:0)

如果您可以将span标记放在不在标记内的值上。也许你可以处理它

由于<span>对值没有任何作用,直到你给它一些风格