2011-11-06 60 views
0

作为一个简单的例子,我试图获得所有包含电子邮件地址的dom对象。在PHP XPath中使用正则表达式 - >评估

$doc = new DOMDocument; 
    $doc->loadHTML($page); 

    $xpath = new DOMXPath($doc); 
    $body = $doc->getElementsByTagName('table')->item(0); 
    $query = "//text()[fn:matches(., '[\w\d\.-][email protected][\w\d\.-]+\.[a-zA-Z]{2,4}')]"; // 
    $entries = $xpath->evaluate($query, $body); // 
    foreach ($entries as $entry) { 
     echo "Found {$entry->textContent}<br>\n"; 
    } 

,我发现了错误:"DOMXPath::evaluate() [domxpath.evaluate]: xmlXPathCompOpEval: function matches bound to undefined prefix fn ..."

我也想尽了办法

//text()[ 
    php:function('BooleanPregMatch', '[\w\d\.-][email protected][\w\d\.-]+\.[a-zA-Z]{2,4}', .) 
] 

没有成功。

我一直没能找到许多与fn:match或php:function相关的例子。任何援助将不胜感激。

+0

我可以建议用双引号在matches()函数中尝试吗? – Scuzzy

+1

你读过['DOMXPath :: registerPhpFunctions()'页面](http://www.php.net/manual/en/domxpath.registerphpfunctions.php)吗? – Phil

回答

4

fn:matches是XPath 2.0,在DOMXPath中,您有XPath 1.0。这就是为什么它不起作用,它不受支持。

有关php:function的示例,请参见DOMXPath::registerPhpFunctions的手册页。你需要有PHP 5.3来注册函数。