2009-10-13 8 views
12

나는 주어진 문자열에서 대문자의 수를 세는 가장 짧고, 가장 단순하고 가장 우아한 방법을 찾고있다.php로 문자열의 대문자를 계산하는 가장 간단한, 가장 짧은 방법은 무엇입니까?

+6

:) –

+0

간단한 나 strlen (strtoupper ($ str을)를)

그래서 나는 소문자 강조 문자로도 작동 자신의 버전을 개선하기 위해 작은 수정을했다 가장 우아한! = 코드 골프 –

+4

str_replace (range ('A', 'Z'), '', $ str, $ num_caps); echo $ num_caps; – GZipp

답변

39
function count_capitals($s) { 
    return strlen(preg_replace('![^A-Z]+!', '', $s)); 
} 
+2

cletus cant write code. 그것은 어디서 왔는가? –

+0

다양한 언어의 특수 UTF-8 문자는 작동하지 않습니다. –

0

가장 짧지는 않지만 정규식을 실행할 필요가 없으므로 틀림없이 가장 간단합니다. 일반적으로 로직과 수표가 단순하기 때문에 이것이 더 빠를 것이라고 말하고 싶지만, PHP는 항상 다른 것들과 비교했을 때 얼마나 빠르고 느린지 놀랍습니다.

function capital_letters($s) { 
    $u = 0; 
    $d = 0; 
    $n = strlen($s); 

    for ($x=0; $x<$n; $x++) { 
     $d = ord($s[$x]); 
     if ($d > 64 && $d < 91) { 
      $u++; 
     } 
    } 

    return $u; 
} 

echo 'caps: ' . capital_letters('HelLo2') . "\n"; 
+0

C처럼! – alex

+3

함수 * count \ _capitals *가 훨씬 빠릅니다. 매우 짧은 문자열 * count \ _capitals *는 조금 빠르지 만 "Lorem ipsum ..."의 첫 번째 단락과 함께 3000 초 반복 실행하는 데는 0.03 초이며 함수 * capital \ _letters를 통해 동일한 문자열을 실행하려면 1.8 초입니다. 3000 번. –

2

나는 어쩌면 우아하지만, 도움이되지 다른 솔루션 줘야 할 것 :

$mixed_case = "HelLo wOrlD"; 
$lower_case = strtolower($mixed_case); 

$similar = similar_text($mixed_case, $lower_case); 

echo strlen($mixed_case) - $similar; // 4 
+2

이 솔루션과 같은 것 같습니다. 대문자와 발음 구별 부호가있는 경우에도 사용할 수 있습니다. +1 – LittleTiger

2

조지 Garchagudashvili 솔루션 놀랍을하지만, 소문자는 분음 부호 나 악센트가 포함 된 경우는 실패합니다. 당신이 부정 행위를하려는 경우

public static function countCapitalLetters($string){ 

    $lowerCase = mb_strtolower($string); 

    return strlen($lowerCase) - similar_text($string, $lowerCase); 
} 
관련 문제