Возможный дубликат:
Как программно использовать функцию 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
Редактировать после комментария: В вашем случае, я полагаю, вам придется:
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; }