Мне тут понадобилось прикрутить к Тандемократии поиск по сайту нашего пока-еще-президента. Сайт его всю жизнь назывался "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 в нужное место :)