programing

대소문자를 구분하지 않는 XPath에 ()가 포함되어 있습니까?

oldcodes 2023. 9. 21. 21:15
반응형

대소문자를 구분하지 않는 XPath에 ()가 포함되어 있습니까?

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의 대답에 대한 해트 팁 - 물론 실제로 찾고 있는 캐릭터만 번역하면 됩니다.)

이 접근 방식은 알파벳에 대한 사전 지식을 필요로 하지 않고 어떤 검색 문자열에도 효과가 있을 것입니다. 이것은 큰 이점입니다.

검색 문자열이 작은 따옴표를 포함할 수 있는 경우 위의 두 가지 방법 모두 실패하고, 이 경우에는 일이 더 복잡해집니다.

최신 XPath 2.0 이상 솔루션

  1. 소문자() 사용:

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

  2. 대소문자를 구분하지 않는 플래그와 성냥들 regex matching을 사용합니다.

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

이전 XPath-1.0 제한 환경은translate()@Tomalak의 답변에 기술되어 있는 기술.

대소문자 구분 안 함contains

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

네. 사용하시면 됩니다.translate다음과 같이 일치시킬 텍스트를 소문자로 변환합니다.

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

XPath 2.0을 사용하는 경우 ()를 포함할 세 번째 인수로 모음을 지정할 수 있습니다.그러나 대조 URI는 표준화되어 있지 않기 때문에 자세한 내용은 사용하는 제품에 따라 다릅니다.

앞서 translate()를 사용하여 제공한 솔루션은 모두 26자 영어 알파벳만 사용한다고 가정합니다.

업데이트: XPath 3.1은 대소문자 구분 매칭을 위한 표준 대조 URI를 정의합니다.

제가 항상 하던 방식은 XPath에서 "번역" 기능을 사용하는 것이었습니다.아주 예쁘다고는 하지 않겠지만, 제대로 작동합니다.

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

이게 도움이 되길 바라면서,

언급URL : https://stackoverflow.com/questions/8474031/case-insensitive-xpath-contains-possible

반응형