2010-11-09 3 views
2

Хорошо, это заводит меня с ума. Я пытаюсь к экрану, скрести следующий бит, казалось бы, тривиальной HTML с phpQuery:Выбор определенного текстового узла с помощью 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()') - это корень документа, поэтому я получаю каждый фрагмент текста во всем документе!

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

ответ

3

От http://php.net/manual/en/domxpath.query.php

DOMNodeList DOMXPath :: запрос ( строка $ выражение [, DOMNode $ ContextNode [, логическое $ registerNodeNS = истинный]])

Таким образом, это должно работать с td, как узел контекста:

$element->xpath->query('text()[1]',$element) 
+0

Спасибо, что в основном работает, но вам нужно передать в DOMNode (вместо phpQueryObject), а затем преобразовать результат, и по причинам я действительно не понимаю селектор XPath '.// text() [ 1] 'не работает, но запрос' xpath-> ('.// ​​text()') -> item (1) 'делает. Таким образом, конечный код заканчивается следующим образом: '$ src_time = pq ($ element) -> xpath-> query ('.// ​​text()', $ element) -> item (1); $ src_time = pq ($ src_time) -> text(); ' Довольно чудовищно, но выполняет свою работу, поэтому спасибо! – jpatokal

0

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

+0

Не бойтесь - братья и сестры возвращаются только те две цифры
. – jpatokal

+0

OH! ОК. Извините, я неправильно читал br (я думал, что один из них был открытым тегом, а другой - закрывающим тегом по какой-то причине) – cwallenpoole

0

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

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); 

Yay!

Смежные вопросы