たとえば、文字列内の文字の大文字と小文字を入れ替えたり切り替えたりするにはどうすればよいですか。
$str = "Hello, My Name is Tom";
コードを実行すると、次のような結果が得られます。
$newstr = "hELLO, mY nAME Is tOM";
これは可能ですか?
文字列が ASCII のみの場合は、XOR を使用できます。
$str = "Hello, My Name is Tom";
print strtolower($str) ^ strtoupper($str) ^ $str;
出力:
hELLO, mY nAME IS tOM
OK、あなたはすでに答えを得ていることを知っていますが、ややあいまいな strtr() 関数がこれに使用されることを叫んでいます;)
$str = "Hello, My Name is Tom";
echo strtr($str,
'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz',
'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ');
マークの回答と機能が非常に似ています。
preg_replace_callback(
'/[a-z]/i',
function($matches) {
return $matches[0] ^ ' ';
},
$str
)
@xtemporeによる説明:
'a' ^ ' '
戻りますA
。これA
は 0x41 でa
0x61 (すべての AZ も同様) であり、スペースが 0x20 であるため機能します。xor することで、その 1 ビットを反転させます。簡単に言うと、大文字に 32 を足して小文字にし、小文字から 32 を引いて大文字にします。
文字列を反復処理して、各文字の大文字と小文字をテストし、変更した文字を呼び出すstrtolower()
かstrtoupper()
、必要に応じて新しい文字列に追加する必要があります。
次のスクリプトは、「ą」などの 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śćŻŹ
この質問が古いことは知っていますが、マルチバイト実装の 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);
}
解決策は、次のようなものを使用することであると思います:
$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
つまり、あなた:
これがアクセントのような特殊文字ではおそらくうまく機能しないという問題があります:-(
そして、これは他のいくつかのキャラクターでうまくいくかもしれない(またはうまくいかないかもしれない)
簡単な提案です:
$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_strtolower
andを使用することmb_strtoupper
です:特殊文字やマルチバイトエンコーディングに役立つかもしれません...