Я хочу иметь короткий и простой способ заменить персонажа:
От А до Б, от В до С, от Z до А, … в PHP.
Я уже пробовал это:
$pwd = "Abc";
for($char = ord('A'); $char <= ord('Z'); $char++) {
$newc = $char+1;
if($newc > 90)
$newc = 65;
$pwd = str_replace(chr($char), chr($newc), $pwd);
$pwd = str_replace(chr($char+32), chr($newc+32), $pwd);
}
echo $pwd;
Но когда я использую его, я получаю только «Ааа» …
$str = 'a';
echo ++$str; // prints 'b'
Это должно работать для вас:
Здесь я просто str_split()
строка в массив, а затем пройти через каждый символ с array_map()
. Там я проверяю, является ли это строчная или прописная буква.
Если да, я просто возвращаю увеличенный символ, и если он переходит zZ
Я только что вернулся aA
,
В конце я просто implode()
массив снова в строку.
<?php
$str = "Aac";
$str = implode("", array_map(function($v){
if(ord($v) >= 65 && ord($v) <= 90)
return (++$v > 90 ? char(65) : $v);
elseif(ord($v) >= 97 && ord($v) <= 122)
return (++$v > 122 ? char(97) : $v);
else
return $v;
}, str_split($str)));
echo $str;
?>
выход:
Bbd
Вот простой цикл, который делает эту работу:
// A function to replace uppercase characters in a string with
// the next letter in the alphabet
function replace($str) {
$len = strlen($str);
for ($i = 0; $i < $len; ++$i) {
// Check if the current character is an uppercase letter
if (ctype_upper($str[$i])) {
if ($str[$i] == 'Z') {
// If it is a "Z", simply make it an "A"
$str[$i] = 'A';
}
else {
// If it is anything else, just get the next
// character from the ASCII table
$str[$i] = chr(ord($str[$i]) + 1);
}
}
}
return $str;
}
Вы можете использовать это так:
echo replace('HELLO, YOU! ABCDEFGH...XYZ');
Это будет выводить IFMMP, ZPV! BCDEFGHI...YZA
как и ожидалось.
Вы можете прочитать больше о ctype_upper
Вот: http://php.net/ctype-upper — это в основном функция для проверки, является ли строка или символ прописными или нет.
chr
а также ord
просто преобразовать код ASCII в символ и наоборот. Прочитайте официальную документацию, если необходимо: http://php.net/ord а также http://php.net/chr.