Что я делаю не так?
Выражение 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
:
Набор узлов преобразуется в строку, возвращая строковое значение узла в наборе узлов, который находится первым в порядке документов. Если набор узлов пуст, возвращается пустая строка.
$xpath->query("//table[php:function('var_dump', string(@id))]");
string(4) "test"
(в таблице id="test"
)