대소문자를 구분하지 않는 문자열 비교
두 변수를 비교하여 동일한지 확인하고 싶지만 대소문자를 구분하지 않아야 합니다.
예를 들어 대소문자가 구분됩니다.
if($var1 == $var2){
...
}
하지만 대소문자를 구분하지 않았으면 좋겠는데 어떻게 접근해야 할까요?
이것은 매우 간단합니다.두 변수 모두 호출하기만 하면 됩니다.
Unicode 또는 국제 문자 세트를 취급할 필요가 있는 경우는, 를 사용할 수 있습니다.
다른 답변에서는 를 사용하는 것이 권장됩니다.이 함수는 멀티바이트 문자를 처리하지 않기 때문에 UTF-8 문자열의 결과는 가짜가 됩니다.
strcasecmp()
문자열이 같은 경우(대문자와 소문자의 차이 제외)는 0을 반환하므로 다음 항목을 사용할 수 있습니다.
if (strcasecmp($var1, $var2) == 0) {
}
문자열이 1바이트 인코딩일 경우 다음과 같이 간단합니다.
if(strtolower($var1) === strtolower($var2))
문자열이 UTF-8인 경우 Unicode의 복잡도를 고려해야 합니다.대소문자와 대소문자는 쌍사 함수가 아닙니다.즉, 소문자가 있는 경우, 대소문자로 변환하고, 다시 소문자로 변환하는 경우, 같은 코드 포인트로 끝나지 않을 수 있습니다(또한 대소문자로 시작하는 경우에도 마찬가지입니다.).
예.
- 'I' ('I'I"' (
Latin Capital Letter I with Dot Above, U+0130
)는 대문자로 "i" ( )가 붙어 있습니다.Latin Small Letter I, U+0069
)는 소문자 변형으로, "i"의 대문자 변형은 "I"입니다(Latin Capital Letter I, U+0049
). - """ (
Latin Small Letter Dotless I, U+0131
)는 소문자로 "I" ( )가 붙어 있습니다.Latin Capital Letter I, U+0049
)는 대문자 변형으로, "I"의 소문자 변형은 "i"입니다(Latin Small Letter I, U+0069
)
그렇게mb_strtolower('ı') === mb_strtolower('i')
는 같은 대문자의 경우에도 false를 반환합니다.대소문자를 구분하지 않는 문자열 비교 기능을 사용하려면 대문자 및 소문자 버전과 비교해야 합니다.
if(mb_strtolower($string1) === mb_strtolower($string2)
|| mb_strtoupper($string1) === mb_strtoupper($string2))
https://codepoints.net (https://dumps.codepoints.net )에서 Unicode 데이터베이스에 대한 쿼리를 실행했는데, 180개의 코드 포인트에서 소문자의 소문자를 사용할 때 다른 문자가 발견되었고, 8개의 코드 포인트에서 소문자의 소문자를 사용할 때 다른 문자가 발견되었습니다.er 케이스
그러나 더 악화됩니다.사용자가 본 동일한 그래피엠 클러스터는 여러 방법으로 인코딩할 수 있습니다.「"」는 다음과 같이 표시됩니다.Latin Small Letter a with Diaeresis (U+00E4)
「」로 합니다.Latin Small Letter A (U+0061)
★★★★★★★★★★★★★★★★★」Combining Diaeresis (U+0308)
– 바이트 수준에서 비교해도 사실이 반환되지 않습니다!
그러나 Unicode에는 이에 대한 해결책이 있습니다.정상화!NFC, NFD, NFKC, NFKD의 4가지 형태가 있습니다.문자열 비교에서는 NFC와 NFD가 동등하고 NFKC와 NFKD가 동등합니다.저는 NFKC가 NFKD보다 짧기 때문에 NFKC를 이용하고 싶습니다.Latin Small Ligature ff, U+FB00
통상의 「, 됩니다.「 2 」 、 「 f 」 ( 2 ℃ ) 。 25 ( 2 ℃ ) 。
결과 함수는 다음과 같습니다.
function mb_is_string_equal_ci($string1, $string2) {
$string1_normalized = Normalizer::normalize($string1, Normalizer::FORM_KC);
$string2_normalized = Normalizer::normalize($string2, Normalizer::FORM_KC);
return mb_strtolower($string1_normalized) === mb_strtolower($string2_normalized)
|| mb_strtoupper($string1_normalized) === mb_strtoupper($string2_normalized);
}
주의:
- Normalizer용 intl 패키지가 필요합니다.
- 이 기능을 최적화하려면 , 우선 같은지 어떤지를 확인해 주세요^^
- NFKC 대신 NFC를 사용하는 것이 좋습니다. 왜냐하면 NFKC는 당신의 취향에 맞는 포맷 구분을 너무 많이 없애기 때문입니다.
- 이 모든 복잡성이 정말 필요한지 아니면 이 기능의 단순한 변형을 원하는지 스스로 결정해야 합니다.
if(strtolower($var1) == strtolower($var2)){
}
안 되는 이유:
if(strtolower($var1) == strtolower($var2)){
}
strcasecmp 를 사용합니다.
언급URL : https://stackoverflow.com/questions/5473542/case-insensitive-string-comparison
'programing' 카테고리의 다른 글
원칙 2 및 추가 필드가 있는 다대다 링크 테이블 (0) | 2022.11.27 |
---|---|
나눗셈에 사용할 때 '/'와 '//'의 차이점은 무엇입니까? (0) | 2022.11.27 |
jQuery 함수(새로운 jQuery 메서드 또는 플러그인)를 만드는 방법 (0) | 2022.11.27 |
Regex 플러스 대 스타의 차이? (0) | 2022.11.27 |
Prepared Statement IN 조항의 대안? (0) | 2022.11.27 |