PHP

Поиск на сайте внешних ссылок и их анкоров

Задача: по файлу 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>';

Результат:

19 апреля 2018