Поэтому я создаю веб-сайт, в котором используется фид базы данных, который уже настроен и уже давно используется клиентом для всех других веб-сайтов.
Они заполняют эту базу данных через внешнюю программу, и у меня нет возможности изменить способ получения моих данных.
Теперь у меня есть следующая проблема: иногда я получаю строки в UTF-8, а иногда и в ASCII (я надеюсь, что у меня эти условия правильные, иногда они немного расплывчаты).
Поэтому я мог бы получить это: Scénic
или Scénic
.
Теперь проблема в том, что я должен преобразовать это в неспециальные символы (так что это станет Scenic
) для URL-адресов.
Я не думаю, что есть функция для преобразования é
в e
(если это нужно сказать), поэтому мне, вероятно, понадобится создать массив для этого, содержащий весь источник и адресатов, но большая проблема заключается в преобразовании é
до é
без нарушения é
когда он приходит через эту функцию.
Или я должен просто создать массив, содержащий все
(например, например: array('é'=>'e','é'=>'e');
и т. д.
Я знаю, как получить é
to é
, выполнив utf8_encode(html_entity_decode('é'))
, однако при выполнении этой же функции вернет é
.
Возможно, я приближаюсь к этому неправильно, но в таком случае мне бы хотелось знать, как я должен подходить к нему.
Благодаря @XzKto и этому комментарию на PHP.net я изменил функцию slug на следующее:
static function slug($input){ $string = html_entity_decode($input,ENT_COMPAT,"UTF-8"); $oldLocale = setlocale(LC_CTYPE, '0'); setlocale(LC_CTYPE, 'en_US.UTF-8'); $string = iconv("UTF-8","ASCII//TRANSLIT",$string); setlocale(LC_CTYPE, $oldLocale); return strtolower(preg_replace('/[^a-zA-Z0-9]+/','-',$string)); }
Я чувствую, что setlocale
часть немного грязная, но это отлично работает для перевода специальных символов в их «нормальные» эквиваленты.
a áñö ïß éèé
возвращает a-ano-iss-eee