Проверка "битых" линков наподобие badlinks.ru

[Удален]
487

Набросал "на коленке". Если на странице не линки на скачивание дивидюков, то даже не очень долго работает и не дюже жрет трафик.

И все же, рекомендую гонять под денвером или под другим локальным сервером, хостеру может не понравиться большой входящий трафик.

<?php

define('LIMIT', 0);
$is_safe_mode = ini_get('safe_mode') == '1' ? 1 : 0;
if (!$is_safe_mode && function_exists('set_time_limit')) set_time_limit(TIME_LIMIT);

header("Expires: Tue, 1 Jul 2003 05:00:00 GMT");
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Pragma: no-cache");

if( !isSet($_GET['test']) )$_GET['test'] = "";

if($_GET['test'] == "")$output = "<h2 align=\"center\">Поиск &quot;битых&quot; линков:</h2>".first_form();
else
{
$output = get_objects($_GET['test'])."<h2 align=\"center\">Новый поиск:</h2>".first_form();
}

echo '<html>
<head>
<title>Поиск &quot;битых&quot; линков и потерянных имиджей</title>
</head>
<body>
'.$output.'
</body>
</html>';

function first_form()
{
return '<form action=""><div align="center">
<strong>URL проверяемой страницы</strong>:&nbsp;<input type="text" name="test" id="test" value="http://" size="37" maxlength="128">
<input type="submit" value="Проверить!">
<br>(URL должен заканчиваться знаком "/" или именем файла)</div></form>';
}

function get_objects($url)
{
$text = file_get_contents($url);
$text = str_replace("''","",$text);
$text = str_replace("\"\"","",$text);
$links = array();

// Поиск для конструкций src="..."
preg_match_all("/src=\"(.+?)\"/is",$text,$tmp_links);
while(count($tmp_links[0]))
{
$links = array_merge($links,$tmp_links[1]); // добавляем свеженайденые URL в список
$text = str_replace($tmp_links[0],$tmp_links[1],$text); // убираем найденые URL из текста
$text = str_replace("src=\"\"","",$text);
preg_match_all("/src=\"(.+?)\"/is",$text,$tmp_links); // продолжаем поиск
}
// Повторяем поиск для конструкций src='...'
preg_match_all("/src='(.+?)'/is",$text,$tmp_links);
while(count($tmp_links[0]))
{
$links = array_merge($links,$tmp_links[1]);
$text = str_replace($tmp_links[0],$tmp_links[1],$text);
$text = str_replace("src=''","",$text);
preg_match_all("/src='(.+?)'/is",$text,$tmp_links);
}
// Повторяем поиск для конструкций href="..."
preg_match_all("/href=\"(.+?)\"/is",$text,$tmp_links);
while(count($tmp_links[0]))
{
$links = array_merge($links,$tmp_links[1]);
$text = str_replace($tmp_links[0],$tmp_links[1],$text);
$text = str_replace("src=\"\"","",$text);
preg_match_all("/href=\"(.+?)\"/is",$text,$tmp_links);
}
// Повторяем поиск для конструкций href='...'
preg_match_all("/href='(.+?)'/is",$text,$tmp_links);
while(count($tmp_links[0]))
{
$links = array_merge($links,$tmp_links[1]);
$text = str_replace($tmp_links[0],$tmp_links[1],$text);
$text = str_replace("src=''","",$text);
preg_match_all("/href='(.+?)'/is",$text,$tmp_links);
}

$base_href = explode("/",$_GET['test']);
$base_href[(count($base_href)-1)] = "";
$base_href = implode("/",$base_href);

$links_cleaned = Array();
foreach($links as $link)
{
$href = $base_href;
while( substr($link,0,3)=="../" )
{
$link = substr($link,3);
$href = substr($base_href,0,-1);

$href = explode("/",$href);
$href[(count($href)-1)] = "";
$href = implode("/",$href);
}
if(substr($link,0,7)!="http://")$link = $href.$link;
$link = str_replace("/./","/",$link);
if(
!stristr($link,"javascript:")
and !stristr($link,"(")
and !stristr($link,"+")
and !stristr($link,"mailto:")
)
$links_cleaned[] = $link;
}

$links_cleaned = array_unique($links_cleaned);
error_reporting(0);
$links = array();
foreach($links_cleaned as $link)
{
$text = file_get_contents($link);
if( strlen($text)>0 )$links[] = "<font color=\"#008000\">".$link."</font>";
else $links[] = "<font color=\"#FF0000\"><strong>".$link."</strong> (битая ссылка)</font>";
}
return implode("<br>",$links);
}

?>

Если у кого-нибудь будут идеи как проверить "живость" линка не скачивая весь контент по линку - буду признателен.

embo
На сайте с 05.12.2008
Offline
24
#1

я бы на вашем месте через сокеты скачивал, к примеру, 512 байт. иначе ссылка на какой-нибудь ISO файл даст повод для размышления.

Плавно двигаемся от сапы к статьям (http://miralinks.ru/users/registration/from:4223)
[Удален]
#2

Сделал через курл проверку HTTP-ответа сервера, вроде пошустрее стало, даже рискнул сделать сканирование первого уровня вложенности от заданной страницы.

Полный код тут.

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий