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 · 93 каммента · рейтинг 15.01
15.02.2013 · 24 каммента · рейтинг 7.81
29.08.2007 · 28 камментов · рейтинг 6.46
30.01.2013 · 13 камментов · рейтинг 5.73
19.01.2008 · 20 камментов · рейтинг 5.55

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

04.10.2020  АлексПравославный обмен ссылками, домашнее порно: А у меня не только русское порно, но ещё и качеств...
08.09.2020  kostikovmuВывод месяца в родительном падеже (PHP, форматирование даты, strftime): Что бы работало в конце функции нужно добавить ret...
04.06.2020  seoonly.ruПробуем Яндекс.Аудитории: неплохо вышло!
26.03.2020  ДенисВывод месяца в родительном падеже (PHP, форматирование даты, strftime): Вставил этот код в файл .php, но ничего не отображ...
11.03.2020  Aleksey FilonovРеклама паблика вконтакте, промежуточный итог - CTR, охват, подписки: Привет, Я видел ваш сайт, и есть несколько услуг, ...

Статсы