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??? →

27.06.2012 · 37 камментов · рейтинг 11.58
15.02.2013 · 24 каммента · рейтинг 9.92
23.01.2013 · 20 камментов · рейтинг 9
30.01.2013 · 13 камментов · рейтинг 7.27
28.03.2008 · 23 каммента · рейтинг 6.85

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

18.11.2017  JohnКак закрыть окно Skype / свернуть нафиг в трэй: Спасибо, добрый человек! Неимоверно раздражало.
10.11.2017  NikПочему не работает form.submit(): Автор, спасибо за статью 5-летней давности. Подари...
27.10.2017  ДенисОбработка кликов и цели в Яндекс.Метрике, улучшенный вариант: Блин. А для не в зуб ногой - можно код целиком выл...
17.10.2017  ДубрDenwer - настройка алиасов (ServerAlias): Ахуенно не это, ахуенно то что кто-то пользуется Д...
29.09.2017  Maxтам же: Спасибо, чувак! Это ахуенно, оно заработало!!!

Статсы