Говорят, что создание сайта - очень длительный и трудоемкий процесс. Мы скажем - НЕТ! Ведь с новыми технологиями, такими как HTML5, CSS3, PHP и MySql можно быстро и легко научиться создавать сайты любой сложности.
Два сумасшедших веб-мастера покажут где что лежит и как этим пользоваться.
Авторизация
Новый
Забыл
Пожалуйста, заполните поля выше. Это нужно сделать обязательно, иначе ничего не получится.
PHP Статейки /

Скрипт определения внешних и внутренних ссылок на HTML странице используя DOM

  • Воскресенье, 26 сентября 2011, 13:39 |
  • Автор: fiamma |
  • Просмотров: 3292 |
  • Комментарии: 1 |
  • В закладки:

Скрипт определения внешних и внутренних ссылок на HTML странице используя DOM Использование объектной модели документа, представленную интерфейсом DOMDocument, позволяет решить широкий круг задач. В частности, можно достаточно легко произвести анализ внутренних и внешних ссылок на HTML-странице. Об это и поговорим.







Пожалуй, стоит начать со следующего фрагмента PHP-кода:

$xml = new DOMDocument();
@$xml->loadHTML($html);

Здесь мы создаём копию объекта DOMDocument и парсим строку HTML-кода, содержащуюся в переменной $html.

Теперь нам нужно получить список всех элементов с именем тега a, что можно сделать следующим образом:

$links = $xml->getElementsByTagName('a');


Примечание: при парсинге HTML-кода, все названия тега автоматически переводятся в нижний регистр, что позволяет избежать ряда проблем.

Полученный результат будет представлять собой объектно-ориентированный массив, который мы можем перебрать, используя тот же foreach. При этом, для удобства работы с атрибутами тегов, мы можно использовать функции класса DOMDocument:

    * hasAttribute() - проверяет наличие указанного атрибута у родительского элемента.
    * getAttribute() - возвращает значение указанного атрибута у родительского элемента.


Подводя итог выше сказанному, можно привести следующие пример PHP-кода, который выведен на экран список значений атрибута href в элементах a:
foreach ( $links as $link ) {
  if ( !$link->hasAttribute('href') ) {
    echo $link->getAttribute('href') . '<br>';
  }
}
С учётом ранее поставленной задачи, нам остаётся лишь определить какие ссылки считать внешними, а какими внутренними. Я предлагаю следующие условия для определения этих терминов:

* Внешние ссылки - начинаются с «http://» или «https://», а домен не совпадает с доменом указанной страницы.
* Внутренние ссылки - содержат относительный путь (без указания домена) или если домен совпадает с доменном указанной страницы.

При этом нам необходимо решить задачу с наличием «www.» в названии домена. Простейший вариант решения данной задачи может выглядеть следующим образом:

$url = 'http://wmas.msk.ru';
$url_host = parse_url($url, PHP_URL_HOST);
if ( preg_match('/^www\./i', $url_host) ) {
  $url_host = substr($url_host, 4);
}


В данном примере, используя php-функцию parse_url() с константой PHP_URL_HOST мы получим компонент host указанного URL. Дальше мы проверяем наличие в нём «www.» в начале строки. Чтобы избежать проблем с регистром я использую регулярное выражение и preg_match(). При наличии в значении $url_host «www.» в начале строки, присваиваем переменной часть строки, начиная с четвёртого символа. Теперь у нас есть название домена без «www.».

Остаётся лишь вставить поставленные ранее условия для определения внутренних и внешних ссылок в наш foreach:

if ( preg_match('/^http(s)?:\/\//i', $href) ) {
  $href_host = parse_url($href, PHP_URL_HOST);
  if ( preg_match('/^www\./i', $href_host) ) {
    $href_host = substr($href_host, 4);
  }
  if ( preg_match('/^' . preg_quote($url_host) . '$/i', $href_host) ) {
    $in_links[] = $href;
  } else {
    $out_links[] = $href;
  }
} else {
  $in_links[] = $href;
}

Думаю, объяснять здесь особо нечего – и так всё понятно. Уточню лишь, что $in_links и $out_links это массивы внутренних и внешних ссылок соответственно.

Бесплатно скачать готовый пример функции outin_links(), которая возвращает двумерный массив с внутренними и внешними ссылками указанной страницы можно здесь - outin_links.zip [1.06 Kb] (cкачиваний: 99)

Источник: http://wmas.msk.ru/

Советуем также ознакомиться с материалом, посвященном созданию простого веб-чата. И еще следует напомнить, что спонсором этого поста является сайт http://лечение-дцп.рф/. Давние наши партнеры, медицинская клиника, благодаря, своим действиям помогла многим деткам Германии и России бороться с раком.
  • Тэги публикацииDomDocument
Добавить комментарий