Ceci est pour XPath 1.0. Si votre environnement prend en charge XPath 2.0, cliquez ici .
Oui. Possible, mais pas beau.
/html/body//text()[
contains(
translate(., 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'),
'test'
)
]
Cela fonctionnerait pour les chaînes de recherche où l'alphabet est connu à l'avance. Ajoutez tous les caractères accentués que vous vous attendez à voir.
Si vous le pouvez, marquez le texte qui vous intéresse avec d'autres moyens, comme le placer dans un <span>
qui a une certaine classe lors de la construction du HTML. De telles choses sont beaucoup plus faciles à localiser avec XPath que des sous-chaînes dans le texte de l'élément.
Si ce n'est pas une option, vous pouvez laisser JavaScript (ou tout autre langage hôte que vous utilisez pour exécuter XPath) vous aider à créer une expression XPath dynamique:
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 du chapeau à la réponse de @ KirillPolishchuk - bien sûr, il vous suffit de traduire les caractères que vous recherchez réellement .)
Cette approche fonctionnerait pour n'importe quelle chaîne de recherche, sans nécessiter de connaissance préalable de l'alphabet, ce qui est un gros plus.
Les deux méthodes ci-dessus échouent lorsque les chaînes de recherche peuvent contenir des guillemets simples, auquel cas les choses se compliquent .
translate()
lui-même ne se soucie pas de la fréquence à laquelle vous répétez chaque caractère -translate(., 'EE', 'ee')
est absolument équivalent àtranslate(., 'E', 'e')
. PS: N'oubliez pas de voter @KirillPolishchuk, l'idée était la sienne.Plus beau:
la source
TEST
àtest
et congéTest
comme il est?translate(., 'TES', 'tes')
. De cette façon, les gens comprendront que ce n'est pas une traduction de mots, mais une traduction de lettres.Solutions XPath 2.0
Utilisez des minuscules () :
/html/body//text()[contains(lower-case(.),'test')]
Utilisez matches () regex correspondant avec son indicateur insensible à la casse:
/html/body//text()[matches(.,'test', 'i')]
la source
Oui. Vous pouvez utiliser
translate
pour convertir le texte que vous souhaitez faire correspondre en minuscules comme suit:la source
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 standardisés, de sorte que les détails dépendent du produit que vous utilisez.
Notez que les solutions données précédemment avec translate () supposent toutes que vous n'utilisez que l'alphabet anglais de 26 lettres.
MISE À JOUR: XPath 3.1 définit un URI de classement standard pour la correspondance sans casse.
la source
La façon dont j'ai toujours fait cela a été d'utiliser la fonction "traduire" dans XPath. Je ne dirai pas que c'est très joli mais cela fonctionne correctement.
J'espère que cela t'aides,
la source