Разбить строку с html тегами в массив php

214
28 февраля 2018, 07:35

Здравствуйте. У меня есть строка с html тегами таблицы. Задача разбить строчку на массив по тегам с их содержимым. Пример:

<table>
  <tr>
    <td>
      <table>
        <tr>
          <td>Текст ячейки №1</td>
          <td>Текст ячейки №2</td>
        </tr>
      </table>
    </td>
    <td>
      <table>
        <tr>
          <td></td>
        </tr>
      </table>
    </td>
  </tr>
</table>

Нашёл решение по ссылке a link:

function walk($output, \DOMNode $node, $depth = 0)
 {
      if ($node->hasChildNodes()) {
         $children = $node->childNodes;
         foreach ($children as $child) {
             if ($child->nodeType === XML_TEXT_NODE) {
                 continue;
             }
         $output[] = $child->nodeName;
         $item = walk(array(), $child, $depth + 1);
         if (!empty($item)) {
             $output[] = $item;
         }
     }
 }
 return $output;
 }
 $dom = new DOMDocument;
 $dom->loadHTML(mb_convert_encoding($html, 'HTML-ENTITIES', 'UTF-8'));
$root = $dom->getElementsByTagName('body')->item(0);
$output = walk(array(), $root, 0);

Всё работает, как нужно и выводит только теги в следующем формате:

["table",["tr",["td",["table",["tr",["td","td"] ...

Вопрос заключается в выводе содержимого(не атрибутов) этих тегов. Типа:

["table":"",["tr":"",["td":"",["table":"",["tr":"",["td":"Текст ячейки №1","td":"Текст ячейки №2"] ...

Пробовал:

array_push($output, array(
        $child->nodeName => $child->textContent));

на выходе:

["table":"Текст ячейки №1Текст ячейки №2 ...
Answer 1

решил так:

function walk($output, \DOMNode $node, $depth = 0)
{
 if ($node->hasChildNodes()) {
     $children = $node->childNodes;
     foreach ($children as $child) {
         if ($child->nodeType === XML_TEXT_NODE) {
            $output[] = $child->textContent; // заменил тело в условии
         }
         $output[] = $child->nodeName;
         $item = walk(array(), $child, $depth + 1);
         if (!empty($item)) {
             $output[] = $item;
         }
     }
 }
 return $output;
}
$dom = new DOMDocument;
$dom->loadHTML(mb_convert_encoding($html, 'HTML-ENTITIES', 'UTF-8'));
$root = $dom->getElementsByTagName('body')->item(0);
$output = walk(array(), $root, 0);

$name = html_entity_decode(str_replace('\u','&#x',$output[1][1][1][1][1][1][0]), ENT_NOQUOTES,'UTF-8'); // для декодирования json формата кириллицы типа - \u041d\u043e\u043c\u0435\u0440
READ ALSO
Как вырованять legend по середине fieldset?

Как вырованять legend по середине fieldset?

Доброго времени суток, возник вопросКак выровнять legend по центру fieldset?

184
Неизвестные отступы [дубликат]

Неизвестные отступы [дубликат]

На данный вопрос уже ответили:

212
В подключенном шрифте только в жирном начертании не показывается неразрывный пробел

В подключенном шрифте только в жирном начертании не показывается неразрывный пробел

По какой причине может не отображаться неразрывный пробел &nbsp; в шрифте и как это исправить? Использую локально подключенный шрифт "Futuris"При...

260
изменить тип поля VARCHAR на DATE

изменить тип поля VARCHAR на DATE

Два года назад была создана база, сейчас хочется ее немного привести в порядок

215