2012-07-02 72 views
2

我試圖獲取使用PHP 5.3中的DOMDocument以大寫字母開頭的html標記。獲取以Xpath(PHP)中的大寫字母開頭的標記

我正在使用在XPath中註冊的php函數來測試它,但該函數以小寫形式接收作爲第一個參數的tagNames。

的XML:

<test> 
    <A>Match this</A> 
    <b>Dont match this</b> 
</test> 

PHP函數:

registerPhpFunctions - phpDoc

... 
public function isUpper($name) { 
    return (bool)preg_match('/^[A-Z]/', $name); 
} 
... 

螞蟻這是XPath:

//*[php:function("\Cdr\Dom\DOMXPath::isUpper", name())] 

功能isUpper以小寫形式接收$ name,因此不起作用。

我的問題是:

  1. 爲什麼不區分大小寫?
  2. 有更好的方法來做到這一點?

回答

0

將代碼加載爲XML而不是HTML。 HTML不區分大小寫。的

$xmlDoc->loadXML('<html>'); 

代替:

$xmlDoc->loadHTML('<html>'); 
0

使用此一襯墊

//*[contains('ABCDEFGHIJKLMNOPQRSTUVWXYZ', substring(name(),1,1))] 

此選擇XML文檔中的任何元件,其名稱的第一個字符被包含在所有大寫字母的字符串。

XSLT - 基於驗證:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 

<xsl:template match="/"> 
    <xsl:copy-of select= 
    "//*[contains('ABCDEFGHIJKLMNOPQRSTUVWXYZ', substring(name(),1,1))]"/> 
</xsl:template> 
</xsl:stylesheet> 

當這個變換所提供的XML文檔應用:

<test> 
    <A>Match this</A> 
    <b>Dont match this</b> 
</test> 

XPath表達式求值和所選擇的節點(在這種情況只是一個)被複制到輸出

<A>Match this</A> 
+0

無關,但在這裏,你有一個輕鬆的方式:http://fsockopen.com/php-programming/your-final-stop-for-php -xpath不區分大小寫 –

0

一個完整的工作例子(test.php的):

$doc = new DOMDocument; 
$doc->load('test.xml'); 

$xpath = new DOMXPath($doc); 
$xpath->registerNamespace("php", "http://php.net/xpath"); 
$xpath->registerPHPFunctions("isUpper"); 

function isUpper($name) { 
    return (bool)preg_match('/^[A-Z]/', $name); 
} 

$els = $xpath->query('//*[php:function("isUpper", name())]'); 

foreach ($els as $el) { 
    echo $el->nodeValue . "\n"; 
} 

測試。XML:

<test> 
    <A>Match this</A> 
    <b>Dont match this</b> 
</test> 

輸出:

lwburk$ php test.php 
Match this 
+0

感謝您的示例。 – Wiliam

+0

無關,但在這裏你有一個無憂的方法:http://fsockopen.com/php-programming/your-final-stop-for-php-xpath-case-insensitive –

相關問題