2011-03-29 4 views
48

두 변수가 같은지 비교해보고 싶습니다. 그러나이 비교에서 대/소문자를 구분하지 않기를 바랍니다.대소 문자를 구별하지 않는 문자열 비교

예를 들어,이 대소 문자를 다음과 같습니다

if($var1 == $var2){ 
    ... 
} 

하지만 난이 접근 할 방법이 대소 문자를 구분되고 싶어?

+1

는 엄격하게, 민감한 (에), 말하기 부울 값만. 그것은 비교 연산자라는 뜻입니다, '=='하나. –

답변

82

이것은 매우 간단합니다. 두 변수 모두에 strtolower()으로 전화하면됩니다.

유니 코드 또는 다국어 문자 집합을 처리해야하는 경우 mb_strtolower()을 사용할 수 있습니다.

유의하시기 바랍니다 다른 답변은 가짜 될 것입니다 어떤 UTF-8 문자열을 멀티 바이트 문자를 처리하지 않습니다 를 작동 strcasecmp() —, 그래서 결과를 사용하는 것이 좋습니다.

+0

감사합니다. mysql_query()에서 대소 문자를 구분하지 않는 WHERE 문을 어떻게 수행 할 수 있는지 알고 싶습니까? –

+1

일반적으로 MySQL 문자열 비교 *는 대소 문자를 구분하지 않습니다. 즉, 'A'= 'a' '는 사실입니다. A reference : http://dev.mysql.com/doc/refman/5.0/en/case-sensitivity.html – syrion

+0

그것은 이상한 일입니다. 그것이 저에게하는 일이 아니기 때문입니다. latin1_swedish_ci에 데이터 정렬을 설정했습니다. –

2
if(strtolower($var1) == strtolower($var2)){ 
} 
0

왜 :

if(strtolower($var1) == strtolower($var2)){ 
} 
57

strcasecmp() 0을 반환 문자열은 (떨어진 경우 변동에서) 동일 그래서 당신이 사용할 수있는 경우 :

if (strcasecmp($var1, $var2) == 0) { 
} 
+3

그냥 == 0을 테스트하는 것을 기억하십시오; 이는 "if (strcasecmp ($ var1, $ var2)) {..."를 쓰는 것이 매우 유혹적이기 때문에 반 직관적이지만이 경우 0은 흔히있는 것처럼 false-notequal이 아니라 동등한 것을 의미합니다. – Chirael

+3

'strcasecmp()'는 멀티 바이트 문자를 처리하지 않으므로 유니 코드를 처리 할 수 ​​없습니다. – syrion

1

사용 strcasecmp을. 당신의 문자열은 단일 바이트 인코딩에있는 경우

+0

다른 답변에서 언급했듯이, 이것은 유니 코드에서 깨졌습니다. – TextGeek

8

, 그것은 간단합니다-에 소문자와에-위 :

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)는 하부 케이스의 변형으로하여, 상부 케이스의 특성이다.
  • 소문자의 문자는 대문자 변형으로서 "I"(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); 
} 

는 참고 :

  • 당신이 그들은 단지 동일한 있다면 먼저 확인하여이 기능을 최적화해야 Normalizer
  • 에 대한 intl 패키지가 필요 ^^
  • NFKC가 너무 많은 서식 지정을 제거하기 때문에 NFKC 대신 NFC를 사용할 수도 있습니다. fo R 취향
  • 당신이 정말로이 모든 복잡성을 필요로하는 경우 당신은 자신을 위해 결정해야하거나이 기능의 간단한 변형을 선호하는 경우에 할 수없는 경우가 운영으로
관련 문제