2013-10-24 51 views
1

如何才能registerPHP功能XPATH?因爲XPATH不允許我使用ends-with()如何在XPath中註冊PHP函數?

以下是一個成員給出的solutions,但它不起作用。

的代碼,他採用的是:

$xpath = new DOMXPath($document); 
$xpath->registerNamespace("php", "http://php.net/xpath"); 
$xpath->registerPHPFunctions("ends_with"); 
$nodes = $x->query("//tr[/td/a/img[php:function('ends-with',@id,'_imgProductImage')]" 

function ends_with($node, $value){ 
    return substr($node[0]->nodeValue,-strlen($value))==$value; 
} 

我使用PHP 5.3.9。

+1

它是'ends_with'還是'ends-with'。函數名稱中有一個連字符 – gwillie

+0

您的問題標題有很多誤導。請在(錯誤)答案下留下評論。只要你有這個具體問題,請從那裏使用http://stackoverflow.com/a/5435487/367456。如果你堅持提出這個問題,請在你的問題中創建一個自包含的工作示例代碼。您目前發佈的代碼無法以當前表單執行。 – hakre

+0

你在PHP手冊中也提到了你所要求的:http://php.net/domxpath.registerphpfunctions - 所以你可能應該更清楚你的具體編程問題在這裏。還是僅僅是你偶然發現一個非工作的答案?如果是這樣,只是downvote非工作的答案(或糾正它)。 – hakre

回答

4

在你的問題,它看起來像一個錯字,沒有名爲ends-with功能無效,因此我希望它不工作:

//tr[/td/a/img[php:function('ends-with',@id,'_imgProductImage')] 
          ^^^^^^^^^ 

而是使用正確的語法,如正確的函數名稱:

//tr[/td/a/img[php:function('ends_with',@id,'_imgProductImage')] 
          ^^^^^^^^^ 

或者例如像下面的例子:

是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> 

PHP:

<?php 
$doc = new DOMDocument; 
$doc->load('book.xml'); 

$xpath = new DOMXPath($doc); 

// Register the php: namespace (required) 
$xpath->registerNamespace("php", "http://php.net/xpath"); 

// Register PHP functions (no restrictions) 
$xpath->registerPHPFunctions(); 

// Call substr function on the book title 
$nodes = $xpath->query('//book[php:functionString("substr", title, 0, 3) = "PHP"]'); 

echo "Found {$nodes->length} books starting with 'PHP':\n"; 
foreach ($nodes as $node) { 
    $title = $node->getElementsByTagName("title")->item(0)->nodeValue; 
    $author = $node->getElementsByTagName("author")->item(0)->nodeValue; 
    echo "$title by $author\n"; 
} 

正如你所看到的,這個例子註冊了所有的PHP函數,包括現有的substr()功能。

有關更多信息,請參閱DOMXPath::registerPHPFunctions,這也是代碼示例的來源。

我希望這是有幫助的,讓我知道如果你仍然有這個問題。

見,以及:

+0

我很欣賞你的深度答案:)你回答了它。 – NullPointer

+0

在[w3schools.com](http://www.w3schools.com/xpath/xpath_functions.asp)列表中有函數名'ends-with(string1,string2)' – NullPointer

+0

您在這裏混合使用兩種語言: XPath(在2.0版本中有'ends-with'),還有PHP(在你的代碼示例中有'end_with')。所以最好不要複製代碼,然後想知道爲什麼它不起作用:您需要先了解它的作用。是的,在Xpath 2.0中有'ends-with',但不是由w3schools,而是由授權的sepcification文件在這裏:http://www.w3.org/TR/xquery-operators/#func-ends-與 - 在涉及多種語言時要小心,您知道您使用的是哪一個,什麼是有效的。 – hakre