Anahtar harf, php

6 Cevap php

Nasıl oldu / örneğin, bir dize karakter harf geçiş takas edebilirsiniz:

$str = "Hello, My Name is Tom";

Ben kodu çalıştırdıktan sonra ben böyle bir sonuç almak:

$newstr = "hELLO, mY nAME Is tOM";

Bu bile mümkün mü?

6 Cevap

Sen yeni bir dizeye modifiye karakter ekleyerek, strtolower() veya strtoupper() olarak uygun çağırarak, her karakterin davayı test dize boyunca yineleme gerekir.

Lütfen dize yalnızca ASCII ise, XOR kullanabilirsiniz:

$str = "Hello, My Name is Tom";

print strtolower($str) ^ strtoupper($str) ^ $str;

Çıkışlar:

hELLO, mY nAME IS tOM

Tamam ben zaten bir cevap var biliyorum, ama biraz karanlık strtr () işlevi bu ;) için kullanılacak dışarı ağlıyor

$str = "Hello, My Name is Tom";
echo strtr($str, 
           'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz',
           'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ');

Mark tarafından cevap fonksiyonu çok benzer.

preg_replace_callback(
    '/[a-z]/i',
    function($matches) {
        return $matches[0] ^ ' ';
    },
    $str
)

Ben bir çözüm böyle bir şey kullanmak olabilir varsayalım:

$str = "Hello, My Name is Tom";
$newStr = '';
$length = strlen($str);
for ($i=0 ; $i<$length ; $i++) {
    if ($str[$i] >= 'A' && $str[$i] <= 'Z') {
        $newStr .= strtolower($str[$i]);
    } else if ($str[$i] >= 'a' && $str[$i] <= 'z') {
        $newStr .= strtoupper($str[$i]);
    } else {
        $newStr .= $str[$i];
    }
}
echo $newStr;

Hangi seni alır:

hELLO, mY nAME IS tOM


i.e. you :

  • özgün dize her karakter üzerinde döngü
  • o A ve Z arasında ise, daha düşük durumda koydu
  • bu a ve z arasında eğer, üst durumda koydu
  • başka, sen-is tutmak

Bu varlık sorun muhtemelen :-( aksan gibi özel karakteri ile güzel iş olmaz


And here is a quick proposal that might (or might not) work for some other characters :

$str = "Hello, My Name is Tom";
$newStr = '';
$length = strlen($str);
for ($i=0 ; $i<$length ; $i++) {
    if (strtoupper($str[$i]) == $str[$i]) {
        // Putting to upper case doesn't change the character
        // => it's already in upper case => must be put to lower case
        $newStr .= strtolower($str[$i]);
    } else {
        // Putting to upper changes the character
        // => it's in lower case => must be transformed to upper case
        $newStr .= strtoupper($str[$i]);
    }
}
echo $newStr;

Bir fikir, şimdi, mb_strtolower and mb_strtoupper kullanmak olacaktır: özel karakterler ile yardım ve multi-byte kodlamaları olabilir ...

Bu soru eski olduğunu biliyorum - ama burada bir multi-byte uygulama benim 2 lezzetleri.

Multi function version: (mb_str_split function found here):

function mb_str_split( $string ) { 
   # Split at all position not after the start: ^ 
   # and not before the end: $ 
   return preg_split('/(?<!^)(?!$)/u', $string ); 
}

function mb_is_upper($char) {
   return mb_strtolower($char, "UTF-8") != $char;
}

function mb_flip_case($string) {
   $characters = mb_str_split($string);
   foreach($characters as $key => $character) {
       if(mb_is_upper($character))
           $character = mb_strtolower($character, 'UTF-8');
       else
           $character = mb_strtoupper($character, 'UTF-8');

       $characters[$key] = $character;
   }
   return implode('',$characters);
}

Tek fonksiyonlu versiyonu:

function mb_flip_case($string) {
    $characters = preg_split('/(?<!^)(?!$)/u', $string );
    foreach($characters as $key => $character) {
        if(mb_strtolower($character, "UTF-8") != $character)
            $character = mb_strtolower($character, 'UTF-8');
        else
            $character = mb_strtoupper($character, 'UTF-8');

        $characters[$key] = $character;
    }
    return implode('',$characters);
}