117 votes

xpath insensible à la casse contient () possible?

J'exécute tous les nœuds de texte de mon DOM et vérifie si la propriété nodeValue contient une certaine chaîne.

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

Ceci est sensible à la casse. Cependant, je veux aussi attraper Test , TEST ou TesT . Est-ce possible avec XPath (en JavaScript)?

135voto

Tomalak Points 150423

Oui. Possible, mais pas beau.

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

Si vous le pouvez, marque les portions de texte qui vous intéressent avec d'autres moyens, comme les enfermant dans un <span> qui a une certaine classe.

Si ce n'est pas possible, vous pouvez avoir JavaScript vous aider avec la construction d'une appropriée de l'expression 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')]"

(Astuce chapeau à @KirillPolishchuk réponse - bien sûr, vous avez seulement besoin de traduire ces personnages, vous êtes réellement à la recherche pour l')

71voto

kjhughes Points 5581

Solutions XPath 2.0

  1. Utilisez des minuscules () :

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

  2. Utilisez match () regex correspondant à son indicateur ne respectant pas la casse:

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

68voto

Kirill Polishchuk Points 28058

Plus beau:

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

11voto

Andy Points 4242

Oui. Vous pouvez utiliser translate pour convertir le texte que vous souhaitez faire correspondre en minuscule comme suit:

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

7voto

Michael Kay Points 52194

Si vous utilisez XPath 2.0, vous pouvez spécifier un classement comme troisième argument de contains (). Cependant, les URI de classement ne sont pas normalisés, donc les détails dépendent du produit que vous utilisez.

Notez que les solutions données précédemment à l'aide de translate () supposent toutes que vous utilisez uniquement l'alphabet anglais de 26 lettres.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X