Работа с Punycode на PHP
Согласно существующим стандартам, любое доменное имя может состоять только из 26 символов латинского алфавита, цифр от 0 до 9 и символа дефиса. До момента, как ICANN разрешила использование символов национальных алфавитов, это правило безоговорочно соблюдалось. Теперь же эти ваши интернеты забиты сайтами с доменами на иероглифах, кириллице, всяких умляутах и прочем юникоде. Лично я считаю, что использование любых национальных символов в доменах, ссылках и именах файлов в интернете должно быть категорически запрещено. Но так как мое мнение в этом вопросе значения не имеет, приходится работать с тем, что есть. Для преобразования домена из национальной кодировки в ACE-последовательность в PHP существует функция idn_to_ascii. Но если бы она работала как надо, то и этой статьи бы не появилось.Code (PHP) : Убрать нумерацию
- // Только домен, конвертирует правильно
- $url='СуперСайт.рф';
- echo idn_to_ascii($url);
- // xn--80ajnvgddkc.xn--p1ai
- // Ссылка целиком, конвертирует с ошибкой
- $url='https://СуперСайт.рф/login/?id=123#result';
- echo idn_to_ascii($url);
- // xn--https://-86g3c5b4doldsk.xn--/login/?id=123#result-pir2e
Все решается при помощи вот такой небольшой функции. Если из ссылки удалось извлечь имя домена, то он преобразуется в ACE-последовательность и заменяется, иначе строка преобразуется целиком как есть.
Code (PHP) : Убрать нумерацию
- function punycode_encode($url) {
- if ($domain=parse_url($url,PHP_URL_HOST)) {
- return str_replace($domain,idn_to_ascii($domain),$url);
- }
- else {
- return idn_to_ascii($url);
- }
- }
Code (PHP) : Убрать нумерацию
- $url='СуперСайт.рф';
- echo punycode_encode($url);
- // xn--80ajnvgddkc.xn--p1ai
- $url='https://СуперСайт.рф/login/?id=123#result';
- echo punycode_encode($url);
- // https://xn--80ajnvgddkc.xn--p1ai/login/?id=123#result
Просмотров: 990 | Комментариев: 0
Метки: PHP
Внимание! Статья опубликована больше года назад, информация могла устареть!
Комментарии
Отзывы посетителей сайта о статье
Комментариeв нет
Добавить комментарий
Заполните форму для добавления комментария