在Xpath中获取以大写字母开头的标记(PHP)

时间:2012-07-02 00:55:55

标签: php html xpath

我正在尝试使用PHP 5.3中的DOMDocument获取以大写字母开头的html标记。

我正在使用在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);
}
...

Ant这是Xpath:

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

函数 isUpper 以小写形式接收$ name,因此无效。

我的问题是:

  1. 为什么不区分大小写?
  2. 有更好的方法吗?

3 个答案:

答案 0 :(得分:0)

将代码加载为XML而不是HTML。 HTML不区分大小写。

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

而不是:

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

答案 1 :(得分: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>

答案 2 :(得分: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";
}

的test.xml:

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

输出:

lwburk$ php test.php 
Match this