(PHP 5 >= 5.3.0, PHP 7, PHP 8)
DOMXPath::registerPhpFunctions — Регистрирует PHP-функции как XPath-функции
Метод разрешает вызывать PHP-функции в XPath-выражениях.
Функция не возвращает значения после выполнения.
options
содержит недопустимые параметры.
overrideEncoding
передали неизвестную кодировку.
Версия | Описание |
---|---|
8.4.0 | При передаче недопустимых названий callback-функций метод теперь выбрасывает ошибку ValueError. При передаче значений, которые не принадлежат типу callable, метод теперь выбрасывает ошибку TypeError. |
8.4.0 |
Параметр restrict теперь принимает callable-выражения,
когда набор callback-функций, доступных для вызова из XPath-выражений,
ограничивают путём передачи массива (array).
|
Примеры на этой странице работают с файлом book.xml, который содержит следующее:
Пример #1 book.xml
<?xml version="1.0" encoding="UTF-8"?> <books> <book> <title>PHP Basics</title> <author>Jim Smith</author> <author>Jane Smith</author> </book> <book> <title>PHP Secrets</title> <author>Jenny Smythe</author> </book> <book> <title>XML basics</title> <author>Joe Black</author> </book> </books>
Пример #2
Пример регистрации PHP-функции как XPath-функции методом DOMXPath::registerPhpFunctions()
и вызова функции через синтаксис php:functionString
<?php
$doc = new DOMDocument();
$doc->load('book.xml');
$xpath = new DOMXPath($doc);
// Обязательная регистрация пространства имён с префиксом 'php'
$xpath->registerNamespace("php", "http://php.net/xpath");
// Регистрация PHP-функций без установки ограничений
$xpath->registerPhpFunctions();
// Вызов функции substr на названии книги
$nodes = $xpath->query('//book[php:functionString("substr", title, 0, 3) = "PHP"]');
echo "Метод нашёл {$nodes->length} книги, название которых начинается с 'PHP':\n";
foreach ($nodes as $node) {
$title = $node->getElementsByTagName("title")->item(0)->nodeValue;
$author = $node->getElementsByTagName("author")->item(0)->nodeValue;
echo "$title автора $author\n";
}
?>
Вывод приведённого примера будет похож на:
Метод нашёл 2 книги, название которых начинается с 'PHP': PHP Basics автора Jim Smith PHP Secrets автора Jenny Smythe
Пример #3
Пример регистрации PHP-функции как XPath-функции методом DOMXPath::registerPhpFunctions()
и вызова функции через синтаксис php:function
<?php
$doc = new DOMDocument();
$doc->load('book.xml');
$xpath = new DOMXPath($doc);
// Обязательная регистрация пространства имён с префиксом 'php'
$xpath->registerNamespace("php", "http://php.net/xpath");
// Регистрация PHP-функций с установкой ограничения только на доступ к функции has_multiple
$xpath->registerPhpFunctions("has_multiple");
function has_multiple($nodes) {
// Функция возвращает true, если список узлов содержит больше одного автора
return count($nodes) > 1;
}
// Фильтрация книг, которые вышли в соавторстве
$books = $xpath->query('//book[php:function("has_multiple", author)]');
echo "Книги, которые написали два или больше автора:\n";
foreach ($books as $book) {
echo $book->getElementsByTagName("title")->item(0)->nodeValue . "\n";
}
?>
Вывод приведённого примера будет похож на:
Книги, которые написали два или больше автора: PHP Basics
Пример #4 Пример регистрации анонимной PHP-функции как XPath-функции методом DOMXPath::registerPhpFunctions() с установкой ограничения через массив callable-значений
<?php
$doc = new DOMDocument();
$doc->load('book.xml');
$xpath = new DOMXPath($doc);
// Обязательная регистрация пространства имён с префиксом 'php'
$xpath->registerNamespace("php", "http://php.net/xpath");
// Регистрация PHP-функций с установкой ограничения только на доступ к функции has_multiple
$xpath->registerPhpFunctions(["has_multiple" => fn ($nodes) => count($nodes) > 1]);
// Фильтрация книг, которые вышли в соавторстве
$books = $xpath->query('//book[php:function("has_multiple", author)]');
echo "Книги, которые написали два или больше автора:\n";
foreach ($books as $book) {
echo $book->getElementsByTagName("title")->item(0)->nodeValue . "\n";
}
?>
Вывод приведённого примера будет похож на:
Книги, которые написали два или больше автора: PHP Basics