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);
}
...

Ant これは Xpath です:

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

関数isUpperは $name を小文字で受け取るため、機能しません。

私の質問は次のとおりです。

  1. 大文字と小文字が区別されないのはなぜですか?
  2. これを行うより良い方法はありますか?
4

3 に答える 3

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
于 2012-07-02T05:33:25.637 に答える
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 式が評価され、選択されたノード (この場合は 1 つだけ) が出力にコピーされます

<A>Match this</A>
于 2012-07-02T01:32:40.513 に答える
0

コードを HTML ではなく XML としてロードします。HTML は大文字と小文字を区別しません。

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

それ以外の:

$xmlDoc->loadHTML('<html>');
于 2012-07-02T01:06:35.940 に答える