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