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

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

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

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

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

Я получаю сообщение об ошибке: xmlXPathCompOpEval: конец функции - не найден

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

Ответы

Ответ 1

from Как использовать 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 ends-with().

Ответ 2

Кажется, что 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 ;-)
}

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

Ответ 3

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

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

Ответ 4

Если вы используете 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;
}