PHP XPath заканчивается

Возможный дубликат:
Как программно использовать функцию XPath в экземпляре XPathExpression?

Я пытаюсь найти все строки вложенной таблицы, содержащие изображение с идентификатором, заканчивающимся «_imgProductImage».

Я использую следующий запрос:

"//tr[/td/a/img[ends-with(@id,'_imgProductImage')]" 

Я получаю сообщение об ошибке: xmlXPathCompOpEval: функция заканчивается – не найдена

Мои поисковые запросы в Google, я считаю, говорят, что это должен быть действительный запрос / функция. Какова фактическая функция, которую я ищу, если она не «кончается»?

Как использовать программу XPath в экземпляре XPathExpression?

Легко построить выражение XPath 1.0, оценка которого дает тот же результат, что и функция ends-with() :

$str2 = substring($str1, string-length($str1)- string-length($str2) +1)

производит тот же логический результат ( true() или false() ) как:

ends-with($str1, $str2)

поэтому для вашего примера должен работать следующий xpath:

//tr[/td/a/img['_imgProductImage' = substring(@id, string-length(@id) - 15)]

вы, вероятно, захотите добавить комментарий, который представляет собой переформулировку xpath 1.0 для end ends-with() .

Кажется, что ends-with() – это функция XPath 2.0 .

DOMXPath поддерживает только XPath 1.0

Редактировать после комментария: В вашем случае, я полагаю, вам придется:

  • Найдите все изображения, используя более простой запрос XPath, который вернет больше изображений, чем вы хотите, – но включите те, которые вы хотите сохранить.
  • Перебирает те, которые тестируются на PHP, для каждого из них, если атрибут id (см. Метод getAttribute ) соответствует тому, что вы хотите.

Чтобы проверить, соответствует ли атрибут, вы можете использовать что-то вроде этого, в цикле, который выполняет итерацию по изображениям:

 $id = $currentNode->getAttribute('id'); if (preg_match('/_imgProductImage$/', $id)) { // the current node is OK ;-) } 

Обратите внимание, что в моем шаблоне regex я использовал $ чтобы указать конец строки .

В XPath 1.0 нет ends-with функцией, но вы можете подделать ее:

 "//tr[/td/a/img[substring(@id, string-length(@id) - 15) = '_imgProductImage']]" 

Если вы используете PHP 5.3.0 или новее, вы можете использовать функции registerPHPFunctions для вызова любой требуемой функции PHP, хотя синтаксис немного нечетный. Например,

 $xpath = new DOMXPath($document); $xpath->registerNamespace("php", "http://php.net/xpath"); $xpath->registerPHPFunctions("ends_with"); $nodes = $x->query("//tr[/td/a/img[php:function('ends-with',@id,'_imgProductImage')]" function ends_with($node, $value){ return substr($node[0]->nodeValue,-strlen($value))==$value; }