xpath без учета регистра содержит () возможно?
Я бегу по всем текстовым узлам моего DOM и проверяю, содержит ли nodeValue определенную строку.
/html/body//text()[contains(.,'test')]
Это с учетом регистра. Впрочем, я тоже хочу поймать Test
, TEST
Одер TesT
, Это возможно с XPath (в JavaScript)?
6 ответов
Это для XPath 1.0. Если ваша среда поддерживает XPath 2.0, см. Здесь.
Да. Возможно, но не красиво.
/html/body//text()[
contains(
translate(., 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'),
'test'
)
]
Если вы можете, отметьте интересующие вас части текста другими средствами, например, заключив их в <span>
это имеет определенный класс.
Если это невозможно, у вас может быть JavaScript, который поможет вам с созданием соответствующего выражения 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 - конечно, вам нужно переводить только те символы, которые вы на самом деле ищете)
Решения XPath 2.0
Используйте строчные буквы ():
/html/body//text()[contains(lower-case(.),'test')]
Используйте match () регулярное выражение соответствия с его регистронезависимым флагом:
/html/body//text()[matches(.,'test', 'i')]
Более красивый:
/html/body//text()[contains(translate(., 'TES', 'tes'), 'test')]
Да. Ты можешь использовать translate
чтобы преобразовать текст, который вы хотите сопоставить, в нижний регистр следующим образом:
/html/body//text()[contains(translate(.,
'ABCDEFGHIJKLMNOPQRSTUVWXYZ',
'abcdefghijklmnopqrstuvwxyz'),
'test')]
Если вы используете XPath 2.0, тогда вы можете указать параметры сортировки в качестве третьего аргумента для метода contains(). Однако URI сортировки не стандартизированы, поэтому детали зависят от продукта, который вы используете.
Обратите внимание, что решения, приведенные ранее с использованием translate(), предполагают, что вы используете только 26-буквенный английский алфавит.
Я всегда делал это, используя функцию "перевод" в XPath. Я не скажу, что это очень красиво, но работает правильно.
/html/body//text()[contains(translate(.,'abcdefghijklmnopqrstuvwxyz',
'ABCDEFGHIJKLOMNOPQRSTUVWXYZ'),'TEST')]
надеюсь это поможет,