PHP DOM - анализировать текстовые узлы, которые содержат определенные теги HTML - PullRequest
1 голос
/ 05 декабря 2011

Недавно я получил помощь в разборе всех текстовых узлов из HTML-документа.Получившийся код был следующим:

$doc = new DOMDocument();
$doc->loadHTML($contents);
$doc->loadHTML("<p>not in the brackets..</p>");
$xpath = new DOMXPath($doc);
$textnodes = $xpath->evaluate('//text()');

Используя следующий экстракт:

<p>This is a <b>nested <i>HTML</i> tag<b>...</p>

Я могу создать массив элементов:

Array
(
  [0] => This is a 
  [1] => nested
  [2] => HTML
  [3] => tag
  [4] => ...
)

Что яхотя на самом деле хотелось бы получить все текстовые узлы , но разрешить «просмотр» некоторых тегов HTML .Например, я не хочу, чтобы теги <i>, <b> и <u> были проанализированы как отдельные узлы;Я бы предпочел, чтобы они присоединились к предыдущему текстовому узлу.Вышеупомянутый массив в идеале должен выглядеть следующим образом:

Array
(
  [0] => This is a nested HTML tag...
)

С другой стороны, теги <p> должны распознаваться как отдельные узлы.Поэтому следующий текст:

<p>paragraph 1 <b>here</b></p> <p>paragraph 2</b>

в идеале будет разбираться как:

Array
(
  [0] => paragraph 1 <b>here</b>
  [1] => paragraph 2

Я немного прочел о XPath и PHP DOM, но, честно говоря, на самом деле у меня нетключ к разгадке.Кто-нибудь может указать мне правильное направление?Спасибо.

Редактировать

Просто чтобы уточнить вывод должен быть в формате массива;Моя цель состоит в том, чтобы разобрать весь текст со страницы, чтобы затем его можно было использовать в файле перевода.Поэтому некоторые определенные теги HTML (<b> и т. Д.) Желательны в разобранном тексте, чтобы сохранить вместе полные предложения - и сохранить разметку примерно нетронутой - в новом файле перевода.

Ответы [ 2 ]

0 голосов
/ 06 декабря 2011

Если у вас есть узел и вы хотите его нормализовать как обычный текст:

XPATH: 'string(thenode)'
DOM:   $thenode->textContent;

Это игнорирует все дочерние узлы, которые не являются текстовыми узлами, и возвращает его как одну строку.

Итак, в вашем примере xpath, такой как string(//p), даст вам массив текстовых абзацев со всеми удаленными элементами. Вы можете сделать то же самое с DOM, используя getElementsByTagName() и выбирая свойство textContent для каждого результата.

Если у вас есть более сложные требования, возможно, вам лучше использовать XSL с преобразованием идентичности для создания нового дерева DOM, которое вам больше по вкусу. Например, если у вас есть несколько узлов верхнего уровня, которые вы хотите (например, <p>), и хотите удалить некоторые, но не все его подузлы (например, "keep em и strong, но свернуть cite вверх), тогда решение DOM будет довольно утомительным.

0 голосов
/ 06 декабря 2011

Попробуйте использовать strip_tags для «просматриваемых тегов» и использовать второй параметр допустимых тегов для тех, которые вы хотите на самом деле разделить.

...