PHP - 切换每个字符的大小写

时间:2013-12-17 11:34:27

标签: php string

如何使用PHP(例如

)切换每个字符的大小写
I didN't gEt anY dEsseRt

i DIDn'T GeT ANy DeSSErT

是否有任何PHP代码可以执行此操作

3 个答案:

答案 0 :(得分:4)

我的初期虽然是“pff,但这很容易”。然后我再想一想,实际上并不是那么简单......

就个人而言,我会这样做:

$upper = range("A","Z");
$lower = range("a","z");
$upper_lower = array_merge($upper,$lower);
$lower_upper = array_merge($lower,$upper);
$replacements = array_combine($upper_lower,$lower_upper);
$output = strtr($input,$replacements);

虽然Arthur Halma的答案令人印象深刻,但它是stolen from here并且未能解释它是如何工作的,所以我们走了!

首先,代码:

$output = strtolower($str) ^ strtoupper($str) ^ $str;

让我们从^开始吧。这是一个非常罕见的运算符:Bitwise XOR。它采用左侧和右侧的位,并将XOR算法应用于它们。在字符串上使用时,它会逐个字符地执行此操作。

以下是XOR算法的样子:

 A | B | A^B
---+---+-----
 0 | 0 |  0
 0 | 1 |  1
 1 | 0 |  1
 1 | 1 |  0

在基础英语中,它表示“如果一个或另一个是真的,但不是两个”。这有点像你问“我应该往北走还是南走?”你无法双管齐下,所以这是一个XOR。

现在,让我们来看看你的字符串中的字符。正如我们很快就会看到的那样,创造角色的人非常聪明。如果你看一下字符图,你会发现字母A到Z的空格从65到90,a到z是97到122.让我们用二进制看一下:

A (65) 01000001    Z ( 90) 01011010
a (97) 01100001    z (122) 01111010

你会注意到,要在大写和小写之间切换,你所要做的就是切换第三高位。这很重要。

那么,关于代码的作用!为简单起见,我只假设输入字符串是“a Z”,因此所需的输出将是“A z”。请注意,空格是字符32或00100000。

a Z: 01100001 00100000 01011010

首先,代码将字符串转换为大写:

A Z: 01000001 00100000 01011010

然后,它将字符串转换为小写:

a z: 01100001 00100000 01111010

接下来,它对大写和小写字符串进行异或运算:

A Z: 01000001 00100000 01011010
a z: 01100001 00100000 01111010
^1 : 00100000 00000000 00100000

现在它对原始字符串进行XOR:

^1 : 00100000 00000000 00100000
a Z: 01100001 00100000 01011010
^2 : 01000001 00100000 01111010

将其转换回字符,然后得到...... A z。案例颠倒的原始字符串。

天才,对吧?

答案 1 :(得分:2)

逐个分割字符串的字符,如

$arr = str_split('yourname');

结果将是

Array
(
    [0] => y
    [1] => o
    [2] => u
    [3] => r
    [4] => n
    [5] => a
    [6] => m
    [7]=>  e
)

在一个循环中逐个获取数组的元素并检查它是否在小型转换为Alphabat,反之亦然

strtolower()strtoupper();个函数。

答案 2 :(得分:0)

将字符串的所有字符转换为数组,然后单独处理它们。

    $str = 'I didN\'t gEt anY dEsseRt';
    $chars = str_split($str); //make an array out of the string
    foreach ($chars as $char){
        if (ctype_lower($char)) //is lowercase
           strtoupper ($char); //make uppercase
        if (ctype_upper($char)) //is uppercase
           strtolower ($char); //make lowercase
    }

    $opposite = implode ('', $chars); //convert back into string