У меня есть внешний источник HTML, который я хочу очистить и преобразовать в локальный файл XML или добавить в базу данных MySQL.
Внешний источник в основном нормализован и (в некоторой степени) семантический, поэтому все, что мне нужно сделать, это использовать XPATH
для получения всего td
контента или всего li
контента и т. Д. Проблема в том, что иногда эти элементы используйте <strong>
или <b>
или <i>
теги для оформления нужных мне элементов.
Это технически семантически, поскольку смысл состоит в том, чтобы добавить акцент к конкретному тексту, и разработчик может захотеть использовать CSS, который не является браузером по умолчанию.
Проблема в том, что фактический контент, который я пытаюсь получить, считается дочерним по отношению к этому встроенному элементу, поэтому расширения PHP, такие как simplexml
или DOMDocument
и DOMNode
, обрабатывают их как таковые. Например:
<table>
<tr><td>Thing 1</td><td>Thing 2</td></tr>
<tr><td>Thing 3</td><td>Thing 4</td></tr>
<tr><td><strong>Thing 5</strong></td><td><strong>Thing 6</strong></td></tr>
</table>
Результатом будет:
[table] =>
[tr] =>
[td] => Thing 1
[td] => Thing 2
[tr] =>
[td] => Thing 3
[td] => Thing 4
[tr] =>
[td] =>
[strong] => Thing 5
[td] =>
[strong] => Thing 6
Очевидно, что вышеприведенное не совсем то, что возвращает simplexml, но вышеизложенное отражает общую проблему.
Таким образом, есть ли способ, используя либо параметр, уже встроенный в DOMDocument, либо используя сложный запрос XPath, чтобы получить содержимое элемента td
, в котором любые дочерние элементы (если они есть) лишены статуса потомка и всех остальных содержимое рассматривается как текст запрашиваемого элемента?
Сейчас единственное решение, которое у меня есть, это либо:
a) имеет цикл foreach
, который проверяет каждый результат, например:
$result_text = ($result -> strong) ? $result - strong : $result;
b) использование регулярного выражения для удаления любых тегов <strong>
из строки HTML перед импортом в любые предварительно созданные классы, такие как simplexml или DOMDocument.