(PHP 5 >= 5.3.0, PHP 7, PHP 8)
DOMXPath::registerPhpFunctions β Π Π΅Π³ΠΈΡΡΡΠΈΡΡΠ΅Ρ PHP-ΡΡΠ½ΠΊΡΠΈΠΈ ΠΊΠ°ΠΊ XPath-ΡΡΠ½ΠΊΡΠΈΠΈ
ΠΠ΅ΡΠΎΠ΄ ΡΠ°Π·ΡΠ΅ΡΠ°Π΅Ρ Π²ΡΠ·ΡΠ²Π°ΡΡ PHP-ΡΡΠ½ΠΊΡΠΈΠΈ Π² XPath-Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΡΡ .
restrictΠΠ°ΡΠ°ΠΌΠ΅ΡΡ ΡΠ°Π·ΡΠ΅ΡΠ°Π΅Ρ Π²ΡΠ·ΡΠ²Π°ΡΡ Π² XPath-Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ.
ΠΠ°ΡΠ°ΠΌΠ΅ΡΡ ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΡ ΡΠΈΠΏΠΎΠ²: string β Π½Π°Π·Π²Π°Π½ΠΈΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ, array β ΠΈΠ½Π΄Π΅ΠΊΡΠ½ΡΠΉ ΠΌΠ°ΡΡΠΈΠ² Ρ Π½Π°Π·Π²Π°Π½ΠΈΡΠΌΠΈ ΡΡΠ½ΠΊΡΠΈΠΉ ΠΈΠ»ΠΈ array β Π°ΡΡΠΎΡΠΈΠ°ΡΠΈΠ²Π½ΡΠΉ ΠΌΠ°ΡΡΠΈΠ² Ρ Π½Π°Π·Π²Π°Π½ΠΈΡΠΌΠΈ ΡΡΠ½ΠΊΡΠΈΠΉ Π² ΠΊΠ»ΡΡΠ°Ρ ΠΈ callable-Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΡΠΌΠΈ Π² Π·Π½Π°ΡΠ΅Π½ΠΈΡΡ .
Π€ΡΠ½ΠΊΡΠΈΡ Π½Π΅ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΠΏΠΎΡΠ»Π΅ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ.
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('examples/book-simple.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('examples/book-simple.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('examples/book-simple.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