2009-10-13 19 views
12

Verilen bir dizgede büyük harf sayısını saymanın en kısa, en basit ve en zarif yolunu arıyorum.php ile bir dizede büyük harfleri saymanın en basit, en kısa yolu?

+6

:;) –

+0

en basit strlen (strtoupper ($ str))

yüzden küçük harf vurgulu harflerle da çalışır o halinin, geliştirmek için küçük bir düzeltme yaptı ve en zarif! = code golf –

+4

str_replace (aralık ('A', 'Z'), '', $ str, $ num_caps); echo $ num_caps; – GZipp

cevap

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

cletus kod yazamıyor. nereden geldi? –

+0

Çeşitli dillerden özel utf-8 karakterlerle çalışmaz. –

0

En kısa değil, ancak bir regex'in yürütülmesi gerekmediği en basit olanıdır. Normalde mantık ve kontrollerin basit olması gibi daha hızlı olması gerektiğini söyleyebilirim, ama PHP her zaman diğer şeylerle karşılaştırıldığında bazı şeylerin ne kadar hızlı ve yavaş olduğuyla beni şaşırtıyor.

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

Tıpkı C'deki gibi! – alex

+3

İşlev * count \ _capitals * şu ana kadar daha hızlıdır. Çok kısa dizelerle * sayım \ _capitals * sadece biraz daha hızlıdır fakat "Lorem ipsum ..." un ilk paragrafı ile 0.03 saniyeyi çalıştırmak için 0.03 saniyeyi vs 1.8 saniyeyi çalıştırmak için aynı dize işlevini çalıştırırsınız * capital \ _letters * 3000 kere. –

2

belki zarif ama yararlı değil başka bir çözüm, verirdim:

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

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

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

Bu çözüm, üzerlerinde aksanlarla yazılmış büyük harfler için bile işe yarayacak gibi görünüyor. +1 – LittleTiger

2

George Garchagudashvili Çözüm şaşırtıcı, ama küçük harfler aksan işaretleri veya aksan içeren eğer başarısız olur. Eğer hile isterseniz

public static function countCapitalLetters($string){ 

    $lowerCase = mb_strtolower($string); 

    return strlen($lowerCase) - similar_text($string, $lowerCase); 
} 
İlgili konular