DOM のすべてのテキストノードを実行し、nodeValue に特定の文字列が含まれているかどうかを確認します。
/html/body//text()[contains(.,'test')]
Test
大文字と小文字が区別されます。ただし、 、TEST
、もキャッチしたいですTesT
。XPath (JavaScript) で可能ですか?
ベストアンサー1
これは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 の回答- もちろん、実際に翻訳したい文字だけを翻訳すればいいのです検索のために。)
このアプローチは、アルファベットの事前知識を必要とせず、どのような検索文字列でも機能するため、大きな利点となります。
上記の方法は両方とも、検索文字列にシングルクォートが含まれる場合に失敗します。その場合、より複雑。