[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: PHP программисты ВЫРУЧАЙТЕ!
5maks5
Ув. форумчани привет!

У меня такая проблема:
Имеется код

<?php
ini_set('max_execution_time',0);
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<?php
function
abi_get_url_object($url, $user_agent=null)
{
define('ABI_URL_STATUS_UNSUPPORTED', 100);
define('ABI_URL_STATUS_OK', 200);
define('ABI_URL_STATUS_REDIRECT_301', 301);
define('ABI_URL_STATUS_REDIRECT_302', 302);
define('ABI_URL_STATUS_NOT_FOUND', 404);
define('MAX_REDIRECTS_NUM', 4);

$TIME_START = explode(' ', microtime());
$TRY_ID = 0;
$URL_RESULT = false;
do
{
$URL_PARTS = @parse_url($url);
if( !is_array($URL_PARTS))
{
break;
};
$URL_SCHEME = ( isset($URL_PARTS['scheme']))?$URL_PARTS['scheme']:'http';
$URL_HOST = ( isset($URL_PARTS['host']))?$URL_PARTS['host']:'';
$URL_PATH = ( isset($URL_PARTS['path']))?$URL_PARTS['path']:'/';
$URL_PORT = ( isset($URL_PARTS['port']))?intval($URL_PARTS['port']):80;
if( isset($URL_PARTS['query']) && $URL_PARTS['query']!='' )
{
$URL_PATH .= '?'.$URL_PARTS['query'];
};
$URL_PORT_REQUEST = ( $URL_PORT == 80 )?'':":$URL_PORT";
$USER_AGENT = ( $user_agent == null )?'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)':strval($user_agent);
$GET_REQUEST = "GET $URL_PATH HTTP/1.0\r\n"
."Host: $URL_HOST$URL_PORT_REQUEST\r\n"
."Accept: text/plain\r\n"
."Accept-Encoding: identity\r\n"
."User-Agent: $USER_AGENT\r\n\r\n";
$SOCKET_TIME_OUT = 30;
$SOCKET = @fsockopen($URL_HOST, $URL_PORT, $ERROR_NO, $ERROR_STR, $SOCKET_TIME_OUT);
if( $SOCKET )
{
if( fputs($SOCKET, $GET_REQUEST))
{
socket_set_timeout($SOCKET, $SOCKET_TIME_OUT);
$header = '';
$SOCKET_STATUS = socket_get_status($SOCKET);
while( !feof($SOCKET) && !$SOCKET_STATUS['timed_out'] )
{
$temp = fgets($SOCKET, 128);
if( trim($temp) == '' ) break;
$header .= $temp;
$SOCKET_STATUS = socket_get_status($SOCKET);
};
if( preg_match('~HTTP\/(\d+\.\d+)\s+(\d+)\s+(.*)\s*\\r\\n~si', $header, $res))
$SERVER_CODE = $res[2];
else
break
;

if( $SERVER_CODE == ABI_URL_STATUS_OK )
{
$content = '';
$SOCKET_STATUS = socket_get_status($SOCKET);
while( !feof($SOCKET) && !$SOCKET_STATUS['timed_out'] )
{
$content .= fgets($SOCKET, 1024*8);
$SOCKET_STATUS = socket_get_status($SOCKET);
};
$TIME_END = explode(' ', microtime());
$TIME_TOTAL = ($TIME_END[0]+$TIME_END[1])-($TIME_START[0]+$TIME_START[1]);
$URL_RESULT['header'] = $header;
$URL_RESULT['content'] = $content;
$URL_RESULT['time'] = $TIME_TOTAL;
$URL_RESULT['description'] = '';
$URL_RESULT['keywords'] = '';
$URL_RESULT['title'] =( preg_match('~<title>(.*)<\/title>~U', $content, $res))?strval($res[1]):'';
if( preg_match_all('~<meta\s+name\s*=\s*["\']?([^"\']+)["\']?\s+content\s*=["\']?([^"\']+)["\']?[^>]+>~', $content, $res, PREG_SET_ORDER) > 0 )
{
foreach($res as $meta)
$URL_RESULT[strtolower($meta[1])] = $meta[2];
};
}
elseif( $SERVER_CODE == ABI_URL_STATUS_REDIRECT_301 || $SERVER_CODE == ABI_URL_STATUS_REDIRECT_302 )
{
if( preg_match('~location\:\s*(.*?)\\r\\n~si', $header, $res))
{
$REDIRECT_URL = rtrim($res[1]);
$URL_PARTS = @parse_url($REDIRECT_URL);

if( isset($URL_PARTS['scheme'])&& isset($URL_PARTS['host']))
$url = $REDIRECT_URL;
else
$url = $URL_SCHEME.'://'.$URL_HOST.'/'.ltrim($REDIRECT_URL, '/');
}
else
{
break;
};
};
};
fclose($SOCKET);
}
else
{
break;
};
$TRY_ID++;
}
while( $TRY_ID <= MAX_REDIRECTS_NUM && $URL_RESULT === false );
return $URL_RESULT;
};



function getinfo($url){
$url = 'http://'.$url.'/';
$user_agent = 'pro100blog info ver 2.0';
$URL_OBJ = abi_get_url_object($url, $user_agent);
if( $URL_OBJ )
{
$CONTENT = $URL_OBJ['content'];
$HEADER = $URL_OBJ['header'];
$TITLE = $URL_OBJ['title'];

$DESCRIPTION = $URL_OBJ['description'];
$KEYWORDS = $URL_OBJ['keywords'];
$TIME_REQUEST = $URL_OBJ['time'];

echo "<table border=0 cellpadding=5>";

if(!$TITLE=='') echo "
<tr>
<td valign=top class=tleft>Заголовок</td>
<td valign=top class=tright><i>"
.$TITLE."</i></td>
</tr>"
;
if(!$DESCRIPTION=='') echo "
<tr>
<td valign=top class=tleft>Описание страницы</td>
<td valign=top class=tright><i>"
.$DESCRIPTION."</i></td>
</tr>"
;
if(!$KEYWORDS=='') echo "
<tr>
<td valign=top class=tleft>Ключевые слова</td>
<td valign=top class=tright><i>"
.$KEYWORDS."</i></td>
</tr>
"
;
if(!$TIME_REQUEST=='') echo "
<tr>
<td valign=top class=tleft>Время отклика</td>
<td valign=top class=tright><i>"
.$TIME_REQUEST."</i> сек.</td>
</tr>
"
;
echo "</table>";


}
else echo "ЗапрашиРоооо°.";
}





?>


Поясняю для чего этот код - это парсер заголовка, описания и ключевых слов! Но проблема в кодировке вывода результата =(
Скрипт показывает нормальные значения если сайт в UTF-8, а вот если сайт который скрипт парсит в Windows-1251 всё коряво в результате!
Помогите как нибудь сделать что бы скрипт автоматически распознавал кодировку проверяемого сайта и если нужно перекодировать то он перекодирует!


В коде есть сроки:

$CONTENT = $URL_OBJ['content'];
$HEADER = $URL_OBJ['header'];
$TITLE = $URL_OBJ['title'];
$TITLE = iconv("windows-1251", "utf-8", $TITLE);
$DESCRIPTION = $URL_OBJ['description'];
$KEYWORDS = $URL_OBJ['keywords'];
$TIME_REQUEST = $URL_OBJ['time'];

Тут я в коде выделил функцию перекодировки! Если проверяемый сайт имеет кодировку Windows-1251 то скрипт переводит и подаёт результаты в UTF-8, но тут как тут другая проблема =( опять же если проверяемый сайт в UTF-8 то всё криво =(

Или может у кого есть нормальный скрипт? Типа такого:
user posted image

Очень надеюсь на вашу помощь!

 ! 

М
Давайте темам адекватные названия!
DedMorozzz




Спустя 6 минут, 50 секунд (7.07.2010 - 11:32) 5maks5 написал(а):
хотелось бы что бы результаты ВЫВОДИЛ ТОЛЬКО В UTF-8 т.е.

Кодирует всегда:
UTF-8 => UTF-8
Windows-1251 => UTF-8


Ну или если проверяемый сайт уже в UTF-8 то что бы скрипт не делал перекодировку...

Спустя 1 минута, 1 секунда (7.07.2010 - 11:33) Slays написал(а):
считывай чарсет сайтов в мета теге, правда тоже имеется не у всех, например
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />


если utf8, то ничо не делай, если другая то проводи через iconv, где первым параметром подставляй считанную кодировку

Спустя 1 минута, 30 секунд (7.07.2010 - 11:34) 5maks5 написал(а):
Цитата (Slays @ 7.07.2010 - 08:33)
считывай чарсет сайтов в мета теге, правда тоже имеется не у всех, например
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />


если utf8, то ничо не делай, если другая то проводи через iconv, где первым параметром подставляй считанную кодировку

Ммм... не совсем понял! Можете помоч реализовать вашу мысль в скрипт!

Буду очень благодарен!!!

Спустя 11 минут, 44 секунды (7.07.2010 - 11:46) 5maks5 написал(а):
дали такой код:

$CONTENT = $URL_OBJ['content'];
$HEADER = $URL_OBJ['header'];
$TITLE = $URL_OBJ['title'];
$DESCRIPTION = $URL_OBJ['description'];
$KEYWORDS = $URL_OBJ['keywords'];
$TIME_REQUEST = $URL_OBJ['time'];

if (strpos($CONTENT, "charset=windows-1251"))
{
$CONTENT = iconv("windows-1251", "utf-8", $CONTENT);
$HEADER = iconv("windows-1251", "utf-8", $HEADER);
$TITLE = iconv("windows-1251", "utf-8", $TITLE);
$DESCRIPTION = $URL_OBJ['description'];
$KEYWORDS = iconv("windows-1251", "utf-8", $KEYWORDS);
}

но сайты которые в UTF-8 результаты выводит нормально, сайт в Windows-1251 отображаются нормально только ключевые слова! заголовок и описание кривое по прежнему.


_____________
Где исходники вселенной?
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.