Заменить диакритические символы "эквивалентным" ASCII в PHP?
Похожие вопросы:
Как и в приведенных выше вопросах, я ищу надежный и надежный способ уменьшить любой символ Юникода до почти эквивалентного ASCII с помощью PHP. Я действительно хочу не сворачивать свою таблицу поиска.
Например (украденный из 1-го ссылочного вопроса): Gračišće
становится Gracisce
Ответы
Ответ 1
Модуль iconv может сделать это, точнее, iconv():
$str = iconv('Windows-1252', 'ASCII//TRANSLIT//IGNORE', "Gracišce");
echo $str;
//outputs "Gracisce"
Основная проблема с iconv заключается в том, что вам просто нужно смотреть ваши кодировки, но это определенно правильный инструмент для работы (я использовал "Windows-1252" для примера из-за ограничений текстового редактора, с которым я работал; ) Особенностью iconv, которую вы определенно хотите использовать, является флаг //TRANSLIT
, который сообщает iconv транслитерировать любые символы, которые не имеют совпадения ASCII в ближайшем приближении.
Ответ 2
Мое решение состоит в том, чтобы создать две строки - сначала с недопустимыми буквами, а вторую с буквами, которые заменят первые.
$from = 'čšć';
$to = 'csc';
$text = 'Gračišće';
$result = str_replace(str_split($from), str_split($to), $text);
Ответ 3
Попробуйте следующее:
function normal_chars($string)
{
$string = htmlentities($string, ENT_QUOTES, 'UTF-8');
$string = preg_replace('~&([a-z]{1,2})(acute|cedil|circ|grave|lig|orn|ring|slash|th|tilde|uml);~i', '$1', $string);
$string = preg_replace(array('~[^0-9a-z]~i', '~-+~'), ' ', $string);
return trim($string);
}
Examples:
echo normal_chars('Álix----_Ãxel!?!?'); // Alix Axel
echo normal_chars('áéíóúÁÉÍÓÚ'); // aeiouAEIOU
echo normal_chars('üÿÄËÏÖÜŸåÅ'); // uyAEIOUYaA
Основываясь на выбранном ответе в этом потоке: URL Friendly Username в PHP?
Ответ 4
Я нашел другое решение, основанное на ответе @zombat.
Проблема с его ответом заключалась в том, что я получал:
Notice: iconv() [function.iconv]: Wrong charset, conversion from `UTF-8' to `ASCII//TRANSLIT//IGNORE' is not allowed in D:\www\phpcommand.php(11) : eval()'d code on line 3
И после удаления //IGNORE
из функции я получил:
Gr'a'e~a~o^O"ucisce
Итак, символ š
был переведен правильно, но другие символы не были.
Решение, которое сработало для меня, представляет собой сочетание между preg_replace
(для удаления всего, кроме [a-zA-Z0-9] - включая пробелы) и решения @zombat:
preg_replace('/[^a-zA-Z0-9.]/','',iconv('UTF-8', 'ASCII//TRANSLIT', "GráéãõÔücišce"));
Вывод:
GraeaoOucisce