2

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

蚂蚁这是 Xpath:

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

函数isUpper以小写形式接收 $name,因此它不起作用。

我的问题是:

  1. 为什么不区分大小写?
  2. 有更好的方法来做到这一点吗?
4

3 回答 3

0

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

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

代替:

$xmlDoc->loadHTML('<html>');
于 2012-07-02T01:06:35.940 回答
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>
于 2012-07-02T01:32:40.513 回答
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
于 2012-07-02T05:33:25.637 回答