Dom在标题和段落中分割文本

时间:2017-02-20 15:35:46

标签: php html twitter-bootstrap dom

我有一个像这样的Html字符串:

<h2>Header 1</h2>
  <p>Example line 1</p>
  <p>Example line 2</p>
  <p>Example line 3</p>
<h2>Header 2</h2>
  <p>Example line 1</p>
  <p>Example line 2</p>
...

我最终希望将其转换为Twitter Bootstrap选项卡Html。为了能够做到这一点,我更喜欢将字符串放在一个(或两个)数组中:

'Header 1' => '<p>Example line 1</p><p>Example line 2</p><p>Example line 3</p>'
'Header 2' => '<p>Example line 1</p><p>Example line 2</p>'

我现在拥有的内容:

$source = new \Htmldom();
$source->load($string);

foreach ($source->find('h2') as $item)
  {
    $tabs[] = $item->innertext;
    $panels[] = $item->next_sibling()->innertext;
  }

这给了我一个带有标题的数组和一个包含这些标题的第一个兄弟的数组(本例中的段落):

array (size=2)
  0 => string 'Header 1' (length=10)
  1 => string 'Header 2' (length=9)

array (size=2)
  0 => string '<p>Example line 1</p>' (length=312)
  1 => string '<p>Example line 1</p>' (length=112)

当然我想要所有段落,而不仅仅是第一段。在我看来,用这种方法是不可能的。我错了吗?我怎样才能做到这一点?

1 个答案:

答案 0 :(得分:0)

尝试循环遍历元素并在h2上停止循环。

实施例

foreach ($source->find('h2') as $item)
  {
    $tabs[] = $item->innertext;
    $next_sibling=true;
    $item_next=$item;    
    while($next_sibling){
        $item_next=$item_next->next_sibling();
        $panels[$item->innertext][] = $item_next->innertext;
        if($item_next->next_sibling() == null || $item_next->next_sibling()->tag == 'h2')
            $next_sibling=false;    

    }        
  }  var_dump($tabs); var_dump($panels);

O / P:

array (size=2)
  0 => string 'Header 1' (length=8)
  1 => string 'Header 2' (length=8)
array (size=2)
  'Header 1' => 
    array (size=3)
      0 => string 'Example line 1' (length=14)
      1 => string 'Example line 2' (length=14)
      2 => string 'Example line 3' (length=14)
  'Header 2' => 
    array (size=2)
      0 => string 'Example line 1' (length=14)
      1 => string 'Example line 2' (length=14)