2017-02-20 109 views
0

大教堂拆分文本我有一個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的引導標籤的HTML。爲了能夠這樣做,我寧願有一個(或兩個)陣列(S)的字符串:

'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) 

當然,我想將所有的段落,不只是第一批。在我看來,這種方法是不可能的。我錯了嗎?我怎樣才能做到這一點?

+0

我可以看到,'

+0

也請給我們鏈接到你用來解析HTML的庫。 –

+0

@michail_w錯字,修復它!該庫是SimplePHPDom。或者任何其他的事情。 – Klaaz

回答

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)