git push --force-with-lease vs. --force

Что я делаю неправильно?

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")

40
задан Alexander Mills 15 October 2018 в 19:42
поделиться