【问题标题】:PHP - switch case of every character [duplicate]PHP - 每个字符的切换大小写[重复]
【发布时间】:2013-12-17 11:34:27
【问题描述】:

如何使用 PHP 切换每个字符的大小写,例如 from

I didN't gEt anY dEsseRt

i DIDn'T GeT ANy DeSSErT

是否有任何 PHP 代码可以做到这一点

【问题讨论】:

    标签: php string


    【解决方案1】:

    我最初的想法是“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。原来的字符串大小写颠倒了。

    天才,对吧?

    【讨论】:

    • 很棒的答案,对 XOR 的解释非常清楚,现在是一个很少使用的运算符。
    • @vascowhite 谢谢 :) 我可能应该回顾一下我的旧代码,看看我多久写一次“如果(A 或 B)而不是(A 和 B)”,基本上是“ if A xor B" 但真的很啰嗦 XD
    【解决方案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(); 函数。

    【讨论】:

    • hal ray hal zardari :D
    【解决方案3】:

    将字符串的所有字符转换成数组,然后分别处理。

        $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
    

    【讨论】:

    • 完全无操作。当然,忽略错误的引号。
    猜你喜欢
    • 1970-01-01
    • 2017-07-23
    • 1970-01-01
    • 1970-01-01
    • 2013-02-01
    • 2015-04-24
    • 2020-07-19
    • 1970-01-01
    • 2018-12-24
    相关资源
    最近更新 更多