我正在尝试使用PHP 5.3中的DOMDocument获取以大写字母开头的html标记。
我正在使用在XPath中注册的php函数来测试它,但该函数以小写形式接收tagNames作为第一个参数。
xml:
<test>
<A>Match this</A>
<b>Dont match this</b>
</test>
php函数:
...
public function isUpper($name) {
return (bool)preg_match('/^[A-Z]/', $name);
}
...
Ant这是Xpath:
//*[php:function("\Cdr\Dom\DOMXPath::isUpper", name())]
函数 isUpper 以小写形式接收$ name,因此无效。
我的问题是:
答案 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