PHP中字符串中每第n个字母的大小写

c9qzyr3d  于 2023-05-16  发布在  PHP
关注(0)|答案(4)|浏览(157)

我试图写一个简单的程序,它需要every 4th letter(不是字符)在一个字符串(不计算空格),并改变case它的相反(如果它在低,改变它的高,反之亦然)。
我目前掌握的情况:

echo preg_replace_callback('/.{5}/', function ($matches){
            return ucfirst($matches[0]);   
     }, $strInput);

样品输入:

The sky is blue

预期结果:

The Sky iS bluE
#   ^4th ^8th ^12th
zfycwa2u

zfycwa2u1#

$str = 'The sky is blue';
    $strArrWithSpace = str_split ($str);
    $strWithoutSpace = str_replace(" ", "", $str);
    $strArrWithoutSpace = str_split ($strWithoutSpace);
    $updatedStringWithoutSpace = '';
    $blankPositions = array();
    $j = 0;
    foreach ($strArrWithSpace as $key => $char) {
        if (empty(trim($char))) {
            $blankPositions[] = $key - $j;
            $j++;
        }
    }

    foreach ($strArrWithoutSpace as $key => $char) {
        if (($key +1) % 4 === 0) {
            $updatedStringWithoutSpace .= strtoupper($char);
        } else {
            $updatedStringWithoutSpace .= $char;
        }

    }

    $arrWithoutSpace = str_split($updatedStringWithoutSpace);
    $finalString = '';
    foreach ($arrWithoutSpace as $key => $char) {
        if (in_array($key, $blankPositions)) {
            $finalString .= ' ' . $char;
        } else {
            $finalString .= $char;
        }
    }

    echo $finalString;
pqwbnv8z

pqwbnv8z2#

试试这个:

$newStr = '';
foreach(str_split($str) as $index => $char) {
    $newStr .= ($index % 2) ? strtolower($char) : strtoupper($char);
}

它将字符串第二个字符大写

wlp8pajw

wlp8pajw3#

<?php
    $str = "The sky is blue";
    $str = str_split($str);
    $nth = 4; // the nth letter you want to replace
    $cnt = 0;
    for ($i = 0; $i < count($str); $i++) {
        if($str[$i]!=" " && $cnt!=$nth)
            $cnt++;
        if($cnt==$nth)
        {
            $cnt=0;
            $str[$i] = ctype_upper($str[$i])?strtolower($str[$i]):strtoupper($str[$i]);
        }
    }
    echo implode($str);
?>

这段代码满足了你的所有条件。

编辑:

我会用

$str = str_replace(" ","",$str);

忽略字符串中的空格。但由于你希望它们在输出中保持原样,所以不得不应用上面的逻辑。

huus2vyu

huus2vyu4#

在匹配每第4个字母后,执行Invert case of all letters in a string (uppercase to lowercase and lowercase to uppercase)中的任何大小写切换技术。
\K告诉tegex引擎忘记之前匹配的字符。
代码:(Demo

$string = 'The sky is blue';
echo preg_replace_callback(
         '/(?:[^a-z]*\K[a-z]){4}/i',
         fn($m) => $m[0] ^ ' ',
         $string
     );

此答案不是精心设计的多字节安全答案。某些多字节字符本身没有可切换的大小写字母。

相关问题