13

たとえば、文字列内の文字の大文字と小文字を入れ替えたり切り替えたりするにはどうすればよいですか。

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

コードを実行すると、次のような結果が得られます。

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

これは可能ですか?

4

9 に答える 9

67

文字列が ASCII のみの場合は、XOR を使用できます。

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

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

出力:

hELLO, mY nAME IS tOM
于 2011-07-07T14:47:27.993 に答える
12

OK、あなたはすでに答えを得ていることを知っていますが、ややあいまいな strtr() 関数がこれに使用されることを叫んでいます;)

$str = "Hello, My Name is Tom";
echo strtr($str, 
           'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz',
           'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ');
于 2010-02-14T01:30:41.387 に答える
6

マークの回答と機能が非常に似ています。

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

@xtemporeによる説明:

'a' ^ ' '戻りますA。これAは 0x41 でa0x61 (すべての AZ も同様) であり、スペースが 0x20 であるため機能します。xor することで、その 1 ビットを反転させます。簡単に言うと、大文字に 32 を足して小文字にし、小文字から 32 を引いて大文字にします。

于 2012-09-24T15:29:16.603 に答える
3

文字列を反復処理して、各文字の大文字と小文字をテストし、変更した文字を呼び出すstrtolower()strtoupper()、必要に応じて新しい文字列に追加する必要があります。

于 2010-02-14T00:24:22.933 に答える
2

次のスクリプトは、「ą」などの UTF-8 文字をサポートします。

  • PHP 7.1+

    $before = 'aaAAąAŚĆżź';
    $after = preg_replace_callback('/./u', function (array $char) {
        [$char] = $char;
    
        return $char === ($charLower = mb_strtolower($char))
        ? mb_strtoupper($char)
        : $charLower;
    }, $before);
    
  • PHP 7.4+

    $before = 'aaAAąAŚĆżź';
    $after = implode(array_map(function (string $char) {
        return $char === ($charLower = mb_strtolower($char))
        ? mb_strtoupper($char)
        : $charLower;
    }, mb_str_split($before)));
    

$before: aaAAąAŚĆżź

$after: AAaĄaśćŻŹ

于 2016-02-25T21:30:06.133 に答える
2

この質問が古いことは知っていますが、マルチバイト実装の 2 つのフレーバーを次に示します。

多機能バージョン: (ここにある mb_str_split 関数):

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

単機能バージョン:

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);
}
于 2013-09-03T11:42:01.710 に答える
1

解決策は、次のようなものを使用することであると思います:

$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;

どちらがあなたを得る:

hELLO, mY nAME IS tOM


つまり、あなた:

  • 元の文字列の各文字をループします
  • A と Z の間にある場合は、小文字にします
  • a と z の間にある場合は、大文字にします
  • それ以外の場合は、そのままにしておきます

これがアクセントのような特殊文字ではおそらくうまく機能しないという問題があります:-(


そして、これは他のいくつかのキャラクターでうまくいくかもしれない(またはうまくいかないかもしれない) 簡単な提案です:

$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;

今、アイデアはmb_strtolowerandを使用することmb_strtoupperです:特殊文字やマルチバイトエンコーディングに役立つかもしれません...

于 2010-02-14T00:29:20.370 に答える