Задача: по файлу sitemap.xml обойти все станицы сайта и найти все внешние ссылки, составить таблицу с адресами станиц и найденными на них url c анкорами.
Решение:
Лучше использовать локальный сервер (denwer, mamp) т.к. процесс ресурсоемкий и обычный хостинг его не потянет.
Скрипт не учитывает «закрытые» ссылки с rel="nofollow"
и <noindex>
.
<?php
// Локаль.
setlocale(LC_ALL, 'ru_RU');
date_default_timezone_set('Europe/Moscow');
header('Content-type: text/html; charset=utf-8');
mb_internal_encoding('UTF-8');
mb_regex_encoding('UTF-8');
mb_http_output('UTF-8');
mb_language('uni');
// Отключение лимитов памяти и времени.
ini_set('memory_limit', '2000M');
set_time_limit(0);
$domеn = 'snipp.ru';
$pt = '/<a (.*?)href=[\"\']([a-z0-9]+)\:\/\/(?!'.$domеn.')(.*?)\/?(.*?)[\"\'](.*?)>(.*?)<\/a>/i';
$xml = simplexml_load_file('http://snipp.ru/sitemap');
foreach ($xml->url as $row) {
$url = strval($row->loc);
$html = file_get_contents($url);
preg_match_all($pt, $html, $matches);
if (!empty($matches)) {
foreach ($matches[4] as $i => $ur) {
if (!strstr($ur, $domеn)) {
$out .= '
<tr>
<td>' . $url . '</td>
<td>' . $matches[2][$i] . '://' . $ur . '</td>
<td>' . $matches[6][$i] . '</td>
</tr>';
}
}
}
}
echo '<table cellspacing="0" border="1" cellpadding="5">' . $out . '</table>';