私はDOMのすべてのテキストノードを実行していて、nodeValueに特定の文字列が含まれているかどうかを確認しています。
/html/body//text()[contains(.,'test')]
これは大文字と小文字が区別されます。しかし、私もキャッチしたいTest
、TEST
またはTesT
。XPath(JavaScript)でそれは可能ですか?
回答:
これはXPath 1.0用です。環境がXPath 2.0をサポートしている場合は、こちらを参照してください。
はい。可能ですが、美しくありません。
/html/body//text()[
contains(
translate(., 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'),
'test'
)
]
これは、アルファベットが事前にわかっている検索文字列で機能します。見たいと思うアクセント付き文字を追加します。
可能であれば、興味のあるテキストを他の方法でマークしてください。 <span>
、HTMLの作成中に特定のクラスを持つます。このようなものは、要素テキスト内の部分文字列よりもXPathで検索する方がはるかに簡単です。
それが選択肢でない場合は、JavaScript(またはXPathの実行に使用している他のホスト言語)に動的XPath式の作成を支援させることができます。
function xpathPrepare(xpath, searchString) {
return xpath.replace("$u", searchString.toUpperCase())
.replace("$l", searchString.toLowerCase())
.replace("$s", searchString.toLowerCase());
}
xp = xpathPrepare("//text()[contains(translate(., '$u', '$l'), '$s')]", "Test");
// -> "//text()[contains(translate(., 'TEST', 'test'), 'test')]"
(@KirillPolishchukの答えのヒント -もちろん、実際に検索している文字だけを翻訳する必要があります。)
このアプローチは、アルファベットの事前知識がなくても、どの検索文字列でも機能します。これは大きな利点です。
検索文字列は、物事を取得した場合には、単一引用符、含めることができたときに上記の方法の両方が失敗し、より複雑に。
translate()
それ自体は、各文字を繰り返す頻度を気にしません- translate(., 'EE', 'ee')
と完全に同等translate(., 'E', 'e')
です。PS:@KirillPolishchukに投票することを忘れないでください。
より美しく:
/html/body//text()[contains(translate(., 'TES', 'tes'), 'test')]
TEST
してtest
そのままにTest
しませんか?
translate(., 'TES', 'tes')
。そうすれば、人々はそれが単語の翻訳ではなく、文字の翻訳であることに気付くでしょう。
lower-case()を使用してください:
/html/body//text()[contains(lower-case(.),'test')]
大文字と小文字を区別しないフラグを使用して、matches()正規表現マッチングを使用します。
/html/body//text()[matches(.,'test', 'i')]