MrDecoy
@MrDecoy
Верставший фронтендер

Как сделать функцию, корректно обрабатывающую и кириллицу и латиницу?

Доброго времени суток. Решаю задачу проверки входящей строки на палиндром(читается в обе стороны: Аргентина манит негра ). Преобразую в один регистр, вырезаю через 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); // Аргентина манит негра! — эта строка палиндром.

  • Вопрос задан
  • 578 просмотров
Решения вопроса 1
@remzalp
Программер чего попало на чем попало
php.net/manual/ru/function.mb-split.php
корректно работает и с уникодовыми многобайтовыми символами.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
iNickolay
@iNickolay
function mb_strrev ($str) {
    $out = '';
    for ($i = mb_strlen($str); $i>=0; $i--) {
        $r .= mb_substr($str, $i, 1);
    }

    return $out;
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы