2009-10-13 64 views

Respuesta

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

cletus no puede escribir el código. ¿De dónde vino? –

+0

No funcionará con caracteres especiales utf-8 de una variedad de idiomas. –

0

No es el más corto, pero podría decirse que es el más simple ya que no es necesario ejecutar una expresión regular. Normalmente, diría que esto debería ser más rápido ya que la lógica y las verificaciones son simples, pero PHP siempre me sorprende con cuán rápidas y lentas son algunas cosas en comparación con otras.

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

¡Al igual que en C! – alex

+3

La función * count \ _capitals * es mucho más rápida. Con cadenas muy cortas * count \ _capitals * es solo un poco más rápido, pero con el primer párrafo de "Lorem ipsum ..." es de 0.03 segundos para ejecutar 3000 iteraciones contra 1.8 segundos para ejecutar la misma cadena a través de la función * capital \ _letters * 3000 veces –

2

que le daría otra solución, tal vez no es elegante, pero muy útil:

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

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

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

Parece que esta solución funcionaría incluso con letras mayúsculas con signos diacríticos. +1 – LittleTiger

2

George Solución Garchagudashvili es increíble, pero falla si las letras minúsculas contienen signos diacríticos o acentos.

así que hice un pequeño arreglo para mejorar su versión, que funciona también con el caso acentuado letras minúsculas:

public static function countCapitalLetters($string){ 

    $lowerCase = mb_strtolower($string); 

    return strlen($lowerCase) - similar_text($string, $lowerCase); 
} 
Cuestiones relacionadas