두 변수가 같은지 비교해보고 싶습니다. 그러나이 비교에서 대/소문자를 구분하지 않기를 바랍니다.대소 문자를 구별하지 않는 문자열 비교
예를 들어,이 대소 문자를 다음과 같습니다
if($var1 == $var2){
...
}
하지만 난이 접근 할 방법이 대소 문자를 구분되고 싶어?
두 변수가 같은지 비교해보고 싶습니다. 그러나이 비교에서 대/소문자를 구분하지 않기를 바랍니다.대소 문자를 구별하지 않는 문자열 비교
예를 들어,이 대소 문자를 다음과 같습니다
if($var1 == $var2){
...
}
하지만 난이 접근 할 방법이 대소 문자를 구분되고 싶어?
이것은 매우 간단합니다. 두 변수 모두에 strtolower()
으로 전화하면됩니다.
유니 코드 또는 다국어 문자 집합을 처리해야하는 경우 mb_strtolower()
을 사용할 수 있습니다.
유의하시기 바랍니다 다른 답변은 가짜 될 것입니다 어떤 UTF-8 문자열을 멀티 바이트 문자를 처리하지 않습니다 를 작동 strcasecmp()
—, 그래서 결과를 사용하는 것이 좋습니다.
감사합니다. mysql_query()에서 대소 문자를 구분하지 않는 WHERE 문을 어떻게 수행 할 수 있는지 알고 싶습니까? –
일반적으로 MySQL 문자열 비교 *는 대소 문자를 구분하지 않습니다. 즉, 'A'= 'a' '는 사실입니다. A reference : http://dev.mysql.com/doc/refman/5.0/en/case-sensitivity.html – syrion
그것은 이상한 일입니다. 그것이 저에게하는 일이 아니기 때문입니다. latin1_swedish_ci에 데이터 정렬을 설정했습니다. –
if(strtolower($var1) == strtolower($var2)){
}
왜 :
if(strtolower($var1) == strtolower($var2)){
}
strcasecmp()
0을 반환 문자열은 (떨어진 경우 변동에서) 동일 그래서 당신이 사용할 수있는 경우 :
if (strcasecmp($var1, $var2) == 0) {
}
, 그것은 간단합니다-에 소문자와에-위 :
if(strtolower($var1) === strtolower($var2))
당신의 문자열이 UTF-8 인 경우, 유니 코드의 복잡성을 고려해야합니다 대문자 소문자가 있고 대문자로 변환 한 다음 다시 소문자로 변환하면 동일한 코드 포인트로 끝나지 않을 수도 있습니다 (그리고 같은 코드 포인트로 끝나지 않을 수도 있습니다. 대문자).
예. 및 "I"의 상부 케이스 변이체 (Latin Capital Letter I, U+0049
) "I"인 -
Latin Capital Letter I with Dot Above, U+0130
)는 "I"는 (Latin Small Letter I, U+0069
)는 하부 케이스의 변형으로하여, 상부 케이스의 특성이다.Latin Capital Letter I, U+0049
)와 인 (Latin Small Letter Dotless I, U+0131
)를 "I"- 및 "I"는 "S 소문자 변이체는"나 "(Latin Small Letter I, U+0069
)인 따라서 mb_strtolower('ı') === mb_strtolower('i')
은 대문자가 같더라도 false를 반환합니다.당신이 정말로 소문자를 구분하지 않는 문자열 비교 기능을 원하는 경우에, 당신은 대문자와 소문자 버전으로 비교해야한다 : 나는 https://codepoints.net (https://dumps.codepoints.net)에서 유니 코드 데이터베이스에 대해 쿼리를 실행 한
if(mb_strtolower($string1) === mb_strtolower($string2)
|| mb_strtoupper($string1) === mb_strtoupper($string2))
내가 ' 내가 대문자 문자의 소문자를 대문자로 할 때 다른 문자를 찾은 소문자의 대문자 소문자와 8 개의 코드 포인트를 취할 때 다른 문자를 찾은 코드 포인트를 찾았습니다.
그러나 : 사용자가 본 것과 같은 제자 클러스터는 여러 가지 인코딩 방법을 가질 수 있습니다. "ä "는 Latin Small Letter a with Diaeresis (U+00E4)
또는 Latin Small Letter A (U+0061)
및 Combining Diaeresis (U+0308)
으로 표시 될 수 있습니다. 바이트 수준에서 비교하면 true가 반환되지 않습니다.
그러나 유니 코드의 경우이 해결책이 있습니다 : Normalization! 네 가지 형태가 있습니다 : NFC, NFD, NFKC, NFKD. 문자열 비교를 위해 NFC와 NFD는 동일하며 NFKC와 NFKD는 동일합니다. NFKC가 NFKD보다 짧고 "ff"(Latin Small Ligature ff, U+FB00
)는 두 개의 정상 "f"(그러나 25도 25로 확장됩니다 ...)로 변환됩니다.
결과 함수가된다 :
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);
}
는 참고 :
는 엄격하게, 민감한 (에), 말하기 부울 값만. 그것은 비교 연산자라는 뜻입니다, '=='하나. –