2009-10-13 3 views
12

Я ищу самый короткий, самый простой и элегантный способ подсчета количества заглавных букв в данной строке.Простейший, самый короткий способ подсчета заглавных букв в строке с php?

+6

Если вы хотите обмануть: STRLEN (strtoupper ($ ул));) –

+0

Простейшее и самый элегантный! = code golf –

+4

str_replace (диапазон ('A', 'Z'), '', $ str, $ num_caps); echo $ num_caps; – GZipp

ответ

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

cletus can not написать код. откуда это? –

+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 ...» это 0,03 секунды для запуска 3000 итераций против 1,8 секунды для запуска одной и той же строки с помощью функции * capital \ _letters * 3000 раз. – 2010-11-02 02:03:35

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); 
}