Разобрать HTML-абзац с php, разбить на отдельные теги с их содержанием и стилем - PullRequest
0 голосов
/ 10 июля 2019

Я пытаюсь разобрать один HTML-абзац в массив его строительных блоков - у меня есть этот HTML-абзац:

$element_content = '<p>Start of paragraph - <strong><em>This note</em></strong> provides <em>information</em> about the contractual terms.</p>';

То, что я до сих пор делал, это:

$dom = new DOMDocument();
$dom->loadXML($element_content);

foreach ($dom->getElementsByTagName('*') as $node) {

    echo $node->getNodePath().'<br>';
    echo $node->nodeValue.'<br>';
}

Что дает мне этот результат:

/p
Start of paragraph - This note provides information about the contractual terms.
/p/strong
This note
/p/strong/em
This note
/p/em
information

Но я бы хотел добиться этого:

/p
Start of paragraph - 
/p/strong/em
This note
/p
 provides 
/p/em
information
/p
 about the contractual terms.

Есть идеи о том, как этого добиться?

1 Ответ

0 голосов
/ 10 июля 2019

Все в DOM является узлом.Не только элементы, но и текст тоже.Вы выбираете узлы элемента, но ваш результат выводит текстовые узлы отдельно.Поэтому вам нужно получить текстовые узлы DOM, которые не являются просто пробельными узлами.Это не сложно с выражением Xpath:

//text()[normalize-space(.) != ""]

//text() извлекает любой текстовый узел в документе (включая разделы CDATA).normalize-space() - это функция Xpath, которая сокращает группы пробелов внутри строки до отдельных пробелов.Начальные и конечные пробелы будут удалены.Поэтому [normalize-space(.) != ""] удаляет все узлы из списка, которые содержат только пробелы.

Родительским узлом каждого текстового узла является его элемент.Соедините:

$document = new DOMDocument();
$document->loadXML($content);
$xpath = new DOMXpath($document);

$nodes = $xpath->evaluate('//text()[normalize-space(.) != ""]');

foreach ($nodes as $node) {
    echo $node->parentNode->getNodePath(), "\n";
    echo $node->textContent, "\n";
}

Вывод:

/p 
Start of paragraph - 
/p/strong/em
This note 
/p 
 provides 
/p/em 
information 
/p 
 about the contractual terms.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...