1. ホーム
  2. javascript

[解決済み] 大文字小文字を区別しないXPath contains()は可能か?

2022-12-02 04:51:47

質問

DOMのすべてのtextnodeについて、nodeValueが特定の文字列を含んでいるかどうかをチェックしています。

/html/body//text()[contains(.,'test')]

これは大文字と小文字を区別する。しかし、私はまた Test , TEST または TesT . XPath (in JavaScript)で可能ですか?

どのように解決するのですか?

これはXPath 1.0用です。あなたの環境が XPath 2.0 をサポートしている場合は、以下を参照してください。 を参照してください。 .


そうですね。可能ですが、美しくありません。

/html/body//text()[
  contains(
    translate(., 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'),
    'test'
  )
]

これは、アルファベットがあらかじめわかっている検索文字列の場合に有効です。予想されるアクセント記号付きの文字を追加してください。


もし可能であれば、興味のあるテキストを他の方法でマークしてください。 <span> で囲むなど、他の方法でマークします。そのようなものは、要素テキストの中の部分文字列よりも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 さんの回答 - もちろん、あなたが実際に翻訳する必要があるのは、その文字だけです。 検索 を検索します)。

このアプローチは、アルファベットの予備知識を必要とせず、どんな検索文字列に対しても機能するでしょう。

上記の両方の方法は、検索文字列がシングルクォートを含むことができる場合に失敗します。 より複雑になります。 .