Что я делаю неправильно?
blockquote>Выражение xpath
@id
(второй параметр) возвращает массив, ноpreg_match
ожидает строку.Преобразуйте его в строку сначала:
string(@id)
.Рядом с этим вам нужно действительно сравнить вывод с 1, поскольку
preg_match
возвращает1
при обнаружении:foreach($xpath->query("//table[@id and 1 = php:function('preg_match', '/post\d+/', string(@id))]") as $key => $row) { var_dump($key, $row, $row->ownerDocument->saveXml($row)); }
Объяснение / Что происходит здесь?:
Выражение xpath по умолчанию возвращает список узлов (точнее, набор узлов). Если вы сопоставляете функцию PHP с такими выражениями, эти множества представлены в виде массива. Вы можете легко проверить, что с помощью
var_dump
:$xpath->query("php:function('var_dump', //table)"); array(1) { [0]=> object(DOMElement)#3 (0) { } }
То же самое для выражения xpath
@id
в контексте каждого элемента таблицы:$xpath->query("//table[php:function('var_dump', @id)]"); array(1) { [0]=> object(DOMAttr)#3 (0) { } }
Вы можете изменить это в строковый типизированный результат, используя функцию xpath
string
:Набор узлов преобразуется в строку, возвращая строковое значение узел в наборе узлов, который является первым в порядке документа. Если набор узлов пуст, возвращается пустая строка.
blockquote>$xpath->query("//table[php:function('var_dump', string(@id))]"); string(4) "test"
(таблица имеет
id="test"
)