Выбор конкретного текстового узла с помощью phpQuery - PullRequest
2 голосов
/ 09 ноября 2010

ОК, это сводит меня с ума.Я пытаюсь отсканировать следующий фрагмент вроде бы тривиального HTML-кода с помощью phpQuery:

<td><nobr>10-05-2009</nobr><br>06:10<br>17:35 -1</td>

Дата проста, поскольку она заключена в тег nobr, например.$element[':first-child']->text() делает свое дело. Но как мне получить мои грязные перчатки на второй бит текста?

CSS работает только с элементами, поэтому nth-child(2),(3) возвращает окружающие теги <br>, а не текст.

Если бы я мог XPath, второй узел в .//text() был бы золотым.Но, очевидно, в phpQuery-land контекст для $element->xpath->query('.//text()') является корнем документа, поэтому я получаю каждый фрагмент текста во всем документе!

Идеи?Все решения в Как выбрать текстовые узлы с помощью jQuery? , по-видимому, связаны с операциями DOM Javascript, которые значительно менее злы, чем ужасный API DOM PHP.Может быть, просто сбросить весь элемент в строку и взорвать его на <br> - это путь ...

Ответы [ 3 ]

3 голосов
/ 09 ноября 2010

С http://php.net/manual/en/domxpath.query.php

DOMNodeList DOMXPath :: query ( строка $ выражение [, DOMNode $ contextnode [, логическое $ registerNodeNS = true ]])

Итак, это должно работать с td в качестве узла контекста:

$element->xpath->query('text()[1]',$element)
0 голосов
/ 10 ноября 2010

Используя ответ Алехандро в качестве основы, я придумал эту маленькую функцию:

function nth_text($element, $n) {
  $xpath = new DOMXPath($element->ownerDocument);
  return $xpath->query('.//text()', $element)->item($n)->textContent;
}

Кстати, это чистый PHP DOM, phpQuery не нужен (или допустим, аргумент должен быть DOMNode или DOMElement).И теперь оригинальная проблема проста:

$src_date = nth_text($element, 0);
$src_time = nth_text($element, 1);

Ууу!

0 голосов
/ 09 ноября 2010

Вы пробовали перебирать текстовые методы $element[':first-child']->siblings()? Это должно дать вам доступ ко всему их тексту, нет?

...