2014-09-20 2 views
0

Я пытаюсь поместить некоторые HTML-информации в массив.Разделить абзацы на многомерный массив

<p>Title 1</p> 
<p><span>Content 1</span></p> 
<p><span>Content 2</span></p> 

<p>Title 2</p> 
<p><span>Content 1</span></p> 
<p><span>Content 2</span></p> 
<p><span>Content 3</span></p> 

Я хочу поместить их в массив с полями «title» и «content». Моя проблема состоит в том, чтобы связать эти p-метки, которые имеют диапазон и принадлежит к одному и тому же заголовку.

Результат должен быть: (strip_tags для заголовка и удалить срок для содержания)

[0]['title'] => 'Title 1', 
[0]['content'] => ' <p>Content 1</p><p>Content 2</p>', 
[1]['title'] => 'Title 2', 
[1]['content'] => ' <p>Content 1</p><p>Content 2</p><p>Content 3</p>', 

Моя попытка:

$paragraphs = explode('<p>', $html); 
for ($i = 0 ; $i < count($paragraphs) ; $i++) { 
    $paragraphs[$i] = '<p>' . $paragraphs[$i]; 
    if (strpos($paragraphs[$i], '<span') !== false) $content .= $paragraphs[$i]; 
    else $title = $paragraphs[$i]; 
} 

Но это объединит все содержимое одной переменной. Мне нужен вышеупомянутый массив ...

+4

Я бы предложил вам посмотреть на [PHP DOM] (http://php.net/manual/en/book.dom.php) для этого. но попробуйте '$ content [$ counter]. = $ paragraph [$ i]' для начала. Вы должны увеличивать '$ counter' на изменение названия. – bansi

ответ

1

Вам необходимо реализовать свой собственный счетчик для проверки изменения названия.

$output = array(); 
$last_title=''; // store last title for reference 
$counter=-1; //your counter 
$paragraphs = explode('<p>', $html); 
for ($i = 1,$c=count($paragraphs) ; $i < $c ; $i++) { //start from the second as there is always a blank row 
    $paragraphs[$i] = '<p>' . $paragraphs[$i]; 
    if (strpos($paragraphs[$i], '<span') !== false) { 
     $output[$counter]['content'] .= trim(strip_tags($paragraphs[$i],'<p>')); 
    } 
    else $title = $paragraphs[$i]; 
    if ($title != $last_title){ 
     $last_title = $title; 
     $counter++; 
     $output[$counter]['title'] = strip_tags($title); 
     $output[$counter]['content'] = ''; 
    } 
} 
print_r ($output); 

Примечание: Я все же предлагаю PHP DOM.

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