Я предполагаю, что ваш HTML специально искажен
Есть много опций, включая xpath и многочисленные библиотеки. Regex не очень хорошая идея . Я нахожу DOMDocument быстрым и относительно простым.
getElementsByTagName, затем итерируйте их, получая innerHTML.
Пример:
<code><?php
function get_inner_html( $node ) {
$innerHTML= '';
$children = $node->childNodes;
foreach ($children as $child) {
$innerHTML .= $child->ownerDocument->saveXML( $child );
}
return $innerHTML;
}
$str = <<<'EOD'
<div>This is a test.</div>
<div>This <b>another</b> a test.</div>
<div/>
<div>This is last a test.</div>
EOD;
$doc = new DOMDocument();
$doc->loadHTML($str);
$ellies = $doc->getElementsByTagName('div');
foreach ($ellies as $one_el) {
if ($ih = get_inner_html($one_el))
$array[] = $ih;
}
?>
<pre>
<?php print_r($array); ?>
// Выход
// Обратите внимание, что там будет
// четвертый элемент массива без проверки `if ($ ih = get_inner_html ($ one_el))` `:
массив
(
[0] => Это тест.
[1] => Это
еще один тест.
[2] => Это последний тест.
)
Попробуйте здесь
Примечание:
Вышеописанное будет работать нормально, если у вас нет вложенных DIVS. Если у вас есть вложенность, вы должны исключить вложенные дочерние элементы при циклическом просмотре innerHTML.
Например, допустим, у вас есть этот HTML:
<div>One
<div>Two</div>
<div>Three</div>
<div/>
<div>Four
<div>Five</div>
</div>
Вот как с этим справиться и получить массив с порядковым номером:
Работа с вложением
<code><?php
function get_inner_html_unnested( $node, $exclude ) {
$innerHTML= '';
$children = $node->childNodes;
foreach ($children as $child) {
if (!property_exists($child, 'tagName') || ($child->tagName != $exclude))
$innerHTML .= trim($child->ownerDocument->saveXML( $child ));
}
return $innerHTML;
}
$str = <<<'EOD'
<div>One
<div>Two</div>
<div>Three</div>
<div/>
<div>Four
<div>Five</div>
</div>
EOD;
$doc = new DOMDocument();
$doc->loadHTML($str);
$ellies = $doc->getElementsByTagName('div');
foreach ($ellies as $one_el) {
if ($ih = get_inner_html_unnested($one_el, 'div'))
$array[] = $ih;
}
?>
<pre>
<?php print_r($array); ?>
Попробуйте здесь