Заменить диакритические символы «эквивалентным» ASCII в PHP?

Связанные вопросы:

  1. Как заменить символы в строке java?
  2. Как заменить специальные символы их эквивалентом (например, «á» для «a») на C #?

Как и в вышеприведенных вопросах, я ищу надежный и надежный способ уменьшить любой символ Юникода до почти эквивалентного ASCII с помощью PHP. Я действительно хочу не сворачивать собственный стол.

Например (украденный с 1-го упоминаемого вопроса): Gračišće становится Gracisce

Модуль iconv может сделать это, точнее, функцию iconv () :

 $str = iconv('Windows-1252', 'ASCII//TRANSLIT//IGNORE', "Gracišce"); echo $str; //outputs "Gracisce" 

Основная проблема с iconv заключается в том, что вам просто нужно смотреть ваши кодировки, но это определенно правильный инструмент для работы (я использовал «Windows-1252» для примера из-за ограничений текстового редактора, с которым я работал;) Функция iconv, который вы определенно хотите использовать, это флаг //TRANSLIT , который сообщает iconv транслитерировать любые символы, которые не имеют совпадения ASCII в ближайшем приближении.

Мое решение состоит в том, чтобы создать две строки – сначала с не разыскиваемыми буквами, а вторую с буквами, которые заменят первые.

 $from = 'čšć'; $to = 'csc'; $text = 'Gračišće'; $result = str_replace(str_split($from), str_split($to), $text); 

Попробуй это:

 function normal_chars($string) { $string = htmlentities($string, ENT_QUOTES, 'UTF-8'); $string = preg_replace('~&([az]{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?

Я нашел другое решение, основанное на ответе @ 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