내 DOM의 모든 텍스트 노드에서 실행 중이며 nodeValue에 특정 문자열이 포함되어 있는지 확인합니다.
/html/body//text()[contains(.,'test')]
대소 문자를 구분합니다. 그러나 나는 또한 잡으려면 Test
, TEST
또는 TesT
. XPath (JavaScript)로 가능합니까?
답변:
이것은 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의 답변에 대한 모자 팁 -물론 실제로 검색 하는 문자 만 번역하면됩니다 .)
이 접근 방식은 알파벳에 대한 사전 지식이 없어도 모든 검색 문자열에 대해 작동하며 이는 큰 장점입니다.
검색 문자열에 작은 따옴표가 포함될 수있는 경우 위의 두 방법 모두 실패합니다.이 경우 상황이 더 복잡해집니다 .
translate()
- 자체가 얼마나 자주 각 문자를 반복 상관하지 않는다 translate(., 'EE', 'ee')
절대적으로 동일합니다 translate(., 'E', 'e')
. 추신 : @KirillPolishchuk에 찬성 투표하는 것을 잊지 마세요. 아이디어는 그의 것이 었습니다.
더 아름다운:
/html/body//text()[contains(translate(., 'TES', 'tes'), 'test')]
TEST
로 test
하고 휴가 Test
그대로?
translate(., 'TES', 'tes')
있습니다. 그렇게하면 사람들은 그것이 단어 번역이 아니라 문자 번역이라는 것을 깨닫게 될 것입니다.
사용 ) (소문자를 :
/html/body//text()[contains(lower-case(.),'test')]
대소 문자를 구분하지 않는 플래그와 일치하는 matches () 정규식을 사용하십시오 .
/html/body//text()[matches(.,'test', 'i')]