Доброго времени суток. Решаю задачу проверки входящей строки на палиндром(читается в обе стороны: Аргентина манит негра ). Преобразую в один регистр, вырезаю через str_replace все лишние возможные символы.
function transformString($string){
$charsToDelete = ['!', '?', ' ', '.', ',', '-', '—'];
$string = mb_strtolower($string);
$string = str_replace($charsToDelete, '', $string);
return $string;
}
После чего нужно перевернуть строку. Так как strrev косячит с кодировкой, то решил разбивать строку на массив через str_split с указанием чтобы использовал 2 байта при разбивке, так как в utf-8 кириллица используется 2 байта на символ, После чего переворачиваю полученный массив и снова объединяю его в строку через implode:
function reverseString($string){
$string = str_split($string,2);
$string = array_reverse($string);
$string = implode($string);
return $string;
}
После чего сравниваю преобразованную строку с перевёрнутой преобразованной строкой и если они равны, то значит входящая строка - палиндром. И вроде как всё отлично, только вот если входящая строка будет не на кириллице, а на латинице, например "Sum summus mus" то при разбивке строки через str_split со вторым параметром 2, и реверсом мы получаем "ussmmuummssu". Как решить данную проблему и написать кроссязычную функцию обработки входящей строки?
Полный листинг:
spoiler$string = "Аргентина манит негра!";
function isPalindrom ($string) {
$textForCheck = transformString($string);
$reversedTextForCheck = reverseString($textForCheck);
echo $textForCheck.'<br>'; //аргентинаманитнегра
echo $reversedTextForCheck.'<br>'; //аргентинаманитнегра
if ($textForCheck === $reversedTextForCheck) {
echo $string . ' — эта строка палиндром.';
} else {
echo "Не полиндром.";
}
return $textForCheck;
};
function transformString($string){
$charsToDelete = ['!', '?', ' ', '.', ',', '-', '—'];
$string = mb_strtolower($string);
$string = str_replace($charsToDelete, '', $string);
return $string;
}
function reverseString($string){
$string = str_split($string,2);
$string = array_reverse($string);
$string = implode($string);
return $string;
}
isPalindrom($string); // Аргентина манит негра! — эта строка палиндром.