【发布时间】:2013-12-17 11:34:27
【问题描述】:
如何使用 PHP 切换每个字符的大小写,例如 from
I didN't gEt anY dEsseRt
到
i DIDn'T GeT ANy DeSSErT
是否有任何 PHP 代码可以做到这一点
【问题讨论】:
如何使用 PHP 切换每个字符的大小写,例如 from
I didN't gEt anY dEsseRt
到
i DIDn'T GeT ANy DeSSErT
是否有任何 PHP 代码可以做到这一点
【问题讨论】:
我最初的想法是“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;
让我们从^ 开始。这是一个非常罕见的运算符:按位异或。它获取左侧和右侧的位,并对它们应用 XOR 算法。当用于字符串时,它会逐个字符地执行此操作。
XOR 算法如下所示:
A | B | A^B
---+---+-----
0 | 0 | 0
0 | 1 | 1
1 | 0 | 1
1 | 1 | 0
在基本英语中,它的意思是“如果一个或另一个是真的,但不是两者都是”。这有点像当你问“我应该向北还是向南?”你不能双向使用,所以它是 XOR。
现在,让我们看一下字符串中的字符。我们很快就会看到,创建字符集的人非常聪明。如果你看一下Character Map,你会发现字母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
现在它对原始字符串进行异或:
^1 : 00100000 00000000 00100000
a Z: 01100001 00100000 01011010
^2 : 01000001 00100000 01111010
将其转换回字符,你会得到...A z。原来的字符串大小写颠倒了。
天才,对吧?
【讨论】:
像这样一一分割字符串的字符
$arr = str_split('yourname');
结果是
Array
(
[0] => y
[1] => o
[2] => u
[3] => r
[4] => n
[5] => a
[6] => m
[7]=> e
)
在循环中一个接一个地获取数组的元素并检查它是否很小,将其转换为 Alphabat,反之亦然
通过strtolower() 和strtoupper(); 函数。
【讨论】:
将字符串的所有字符转换成数组,然后分别处理。
$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
【讨论】: