Войти через VK Войти через FB Войти через Google Войти через Яндекс
Поиск по сайту
Определение кодировки страницы сайта.
Чтение страницы сайта и преобразование в UTF-8 или в Windows-1251
При формированнии карт сайтов с помощью сервиса периодически сталкивался с проблемами некорректного указания кодировки страницы или неуказания кодовой страницы вообще. В настоящий момент у меня работает функция анализа кодовой страницы похожая на представленную ниже.
Представленный ниже пример читает страницу, преобразует её в UTF-8, загружает в DOM-объект, получает из него title и выводит его в кодировке windows-1251.
Запрос:
<form method="get">
<label>Страница для анализа: <input type="text" name="url"></label>
</form>
PHP анализ и обработка:
$url=@$_GET['url'];
echo "<br>Страница <b>".$url."</b><br>\n";
$curl = curl_init($url);
curl_setopt($curl, CURLOPT_RETURNTRANSFER,true);
curl_setopt($curl, CURLOPT_HEADER, 1); // включать header в вывод
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1); // следовать любому "Location: " header
curl_setopt($curl, CURLOPT_TIMEOUT, 20); // максимальное время в секундах, для работы CURL-функций.
$html = @curl_exec($curl);
$header_size = curl_getinfo($curl, CURLINFO_HEADER_SIZE);
curl_close($curl); // close cURL handler
$headers = substr($html, 0, $header_size - 4)."\n";
$body = substr($html, $header_size);
if (preg_match("|Content-Type: .*?charset=(.*)\n|imsU", $headers, $results))$ct0=trim($results[1]);
else $ct0=false;
if (preg_match_all('/(<meta\s*http-equiv=[\'\"]Content-Type[\'\"]\s*content=[\'\"][^;]*;\s*charset=([^\"\']*?)(?:"|\;|\')[^>]*>)/i',$body,$arr,PREG_PATTERN_ORDER)){
$ct1=strtolower(trim($arr[2][0]));
// не учитываю, что заголовки могут быть разными. Это в платной версии.
if ($ct1=='utf-8')$ct1=false;
$ct0=false; // meta не добавлять
}else $ct1=false;
if ($ct1){
echo "<br>Преобразование ".$ct1." -> UTF-8";
$body=@iconv($ct1,'utf-8//IGNORE',$body);
}
// добавляю в head Content-Type
if($ct0)$body=preg_replace('/<head[^>]*>/','<head>
<meta charset="utf-8">
',$body);
// читаю преобразованный заголовок страницы с помощью DOM
// в полном примере это сделано с помощью регулярного выражения
$doc = new DOMDocument();
@$doc->loadHTML($body);
if ( ($tags = @$doc->getElementsByTagName('title')) ) {
$title = @$tags->item(0)->nodeValue;
print "<br>Заголовок страницы: ".@iconv("UTF-8", "windows-1251//IGNORE", $title).'<br />';
}
Приведенный пример упрощен и не содержит обработку "трудных" случаев. Полный пример дополнительно:
- понимает, когда кодовая страница в header указана одна, а в META другая
- содержит обработку двойных мета с разными кодовыми страницами(и такое у меня попадалось)
- "борется" с кривыми страницами
- умеет читать страницы по https даже с "кривыми" и самоподписанными сертификатами
Представленный полный код будет корректно работать на 99% страниц/сайтов в рунете.
Всего за 250 рублей (~3$) Вы можете приобрести готовый скрипт получения кодовой страницы. Код скрипта реализован на PHP, полностью открытый и не использует никаких дополнительных библиотек.
Соглашение по использованию платной версии:
- Вы можете использовать полученный код в любых своих разработках, вы не обязаны указывать ссылку на источник.
- Вы НЕ имеете права перепродавать её, размещать в свободном или ограниченном доступе, а также публиковать в любом виде.
- Все остальные права сохраняются за автором.
Регистрация Войти Войти через VK Войти через FB Войти через Google Войти через Яндекс
Вас может заинтересовать:
- Семантический анализатор сайта
- Склонятор - Функция склонения слов русского языка: названий, имен и т.д.
- Генератор карты сайта
.
Прокомментировать/Отблагодарить