Dubrowsky
Хроники одного дупла
Блогово  →  WebDev  → 

Кириллические URL, РФ-домены и конвертация punycode

17 Апреля 2012 года

Мне тут понадобилось прикрутить к Тандемократии поиск по сайту нашего пока-еще-президента. Сайт его всю жизнь назывался "kremlin.ru", однако Дмитрий Анатольевич, как мы помним, не остался равнодушным к появлению зоны .рф и засквотил себе зеркальце - "президент.рф". И теперь это главное зеркало в Яндексе. Ладно, искать по host:президент.рф Яндекс.XML вполне умеет, тут хитростей нет. Но вот в поле URL он честно отдает "xn--d1abbgf6aiiy.xn--p1ai"...

Ну, можно им назло так и показать. Но юзеров жалко - они ж не поймут... Хочется добиться, чтоб URL выглядел человекопонятно. Что для этого делаем:

1. Конвертируем punycode в кириллицу

Погуглив яндексом punycode-конвертер на php, быстро находим класс idna_convert на phpclasses.org (там нужна регистрация, но для ленивых есть прямая ссылка). Вроде класс вполне рабочий.

2. Отображаем кириллические урлы

Тут много ума не надо: urldecode в помощь :) В теории могут попадаться урлы, закодированные из windows-1251, а не из utf-8. Тогда сверху можно положить какой-нибудь to_utf() на основе iconv().

3. Подсвечиваем имя домена и отбрасываем схему (http://)

Это сугубо для красоты :)

4. Собираем все вместе

На выходе у меня получилась нижеследующая функция, которая делает все вышеописанное :) То есть, если например какая-нибудь выставка ретро автомобилей заимела зеркало "выставка-авто.рф", и сделала страничку "/новости/" - наша функция страшный урл типа:

http://xn----7sbabgbd4dybwlh1i.xn--p1ai/%D0%BD%D0%BE%D0%B2%D0%BE%D1%81%D1%82%D0%B8/

покажет красиво-понято, как-то так:

выставка-авто.рф/новости/

- а мы только того и хотим. Встречайте =)

function showCyrUrl($url) {
    $url = parse_url($url);


    
    $host = $url['host'];
    
    if (preg_match("~^xn\-\-~", $host)) {
        require_once('idna_convert.class.php');
        $convert = new idna_convert();
        $host = $convert->decode($host);
    }
    
    $path = isset($url['path']) ? urldecode($url['path']) : '';
    $query = isset($url['query']) ? '?'.urldecode($url['query']) : '';
    return sprintf(
        '<b>%s</b>%s%s',
        $host,
        $path,
        $query
    );
}

Не забываем положить idna_convert.class.php в нужное место :)

Камменты

Саша27.02.2014, 18:16#
С .рус точно так же нужно делать?
Дуброн самый05.03.2014, 19:32#
Саша, ага. На выходе должна получаться строка в utf-8, пофиг рус не рус, хоть иероглифы :)

Написать коммент: памятка постеру

 

Крутые посты wtf??? →

02.10.2012 · 91 каммент · рейтинг 18.27
27.06.2012 · 37 камментов · рейтинг 11.37
28.04.2008 · 44 каммента · рейтинг 9.42
29.08.2007 · 28 камментов · рейтинг 7.27
30.01.2013 · 13 камментов · рейтинг 7.13

Последне камменты

16.02.2018  CrazyMiheyКак изменить оболочку (shell) по умолчанию для пользователя Linux: Ну и сколько Страждущих ломанулись подбирать Парол...
28.01.2018  Привет Ера Связь: 04acw1pf8fwgmqhpfp22t6398o4zszhe3x9lj7luwizkodzt7...
26.01.2018  JasonСвязной.Банк закрыл возможность пополнения WebMoney: Hello Здравствуйте. Сервис продвижения в социальны...
24.01.2018  Annaтам же: Hi Здравствуйте. Сервис продвижения в социальных с...
14.12.2017  БраузерНовый Яндекс.Браузер - браузер "Yandex" (отзыв / обзор): Я предпочитаю использовать яндекс браузер

Статсы