내 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의 답변에 대한 모자 팁 -물론 실제로 검색 하는 문자 만 번역하면됩니다 .)
이 접근 방식은 알파벳에 대한 사전 지식이 없어도 모든 검색 문자열에 대해 작동하며 이는 큰 장점입니다.
검색 문자열에 작은 따옴표가 포함될 수있는 경우 위의 두 방법 모두 실패합니다.이 경우 상황이 더 복잡해집니다 .
답변
더 아름다운:
/html/body//text()[contains(translate(., 'TES', 'tes'), 'test')]
답변
XPath 2.0 솔루션
-
사용 ) (소문자를 :
/html/body//text()[contains(lower-case(.),'test')]
-
대소 문자를 구분하지 않는 플래그와 일치하는 matches () 정규식을 사용하십시오 .
/html/body//text()[matches(.,'test', 'i')]
답변
예. 를 사용 translate
하여 다음과 같이 일치시킬 텍스트를 소문자로 변환 할 수 있습니다 .
/html/body//text()[contains(translate(.,
'ABCDEFGHIJKLMNOPQRSTUVWXYZ',
'abcdefghijklmnopqrstuvwxyz'),
'test')]
답변
XPath 2.0을 사용하는 경우 contains ()에 대한 세 번째 인수로 데이터 정렬을 지정할 수 있습니다. 그러나 데이터 정렬 URI는 표준화되지 않으므로 세부 정보는 사용중인 제품에 따라 다릅니다.
이전에 translate ()를 사용하여 제공된 솔루션은 모두 26 자 영어 알파벳 만 사용한다고 가정합니다.
업데이트 : XPath 3.1은 대소 문자 구분없이 일치하는 표준 데이터 정렬 URI를 정의합니다.
답변
내가 항상이 작업을 수행 한 방법은 XPath에서 “번역”기능을 사용하는 것입니다. 나는 그다지 예쁘다고 말하지는 않을 것이지만 올바르게 작동합니다.
/html/body//text()[contains(translate(.,'abcdefghijklmnopqrstuvwxyz',
'ABCDEFGHIJKLOMNOPQRSTUVWXYZ'),'TEST')]
도움이 되었기를 바랍니다,