Главная > Практика

Парсим ссылки на сайте

12 февраля 2010 | Просмотров: 6171

Попробуем сегодня решить еще одну интересную задачу с использованием все тех же регулярных выражений. На этот раз попытаемся найти на некоторой (любой) вэб-странице все ссылки, получить их анкор и значение параметра href. Подобный разбор вэб-страницы в общем, и ссылки в частности часто называется парсингом.

Итак, для начала нам потребуется составить регулярное выражение для поиска ссылок на странице. Начало этого выражения будет весьма похоже на то, что мы делали для поиска изображений на странице, а именно:

<a\s+href\s*=\s*["\']?

Здесь используется специальный символ \s соответствующий любому пробельному символу, квантификаторы + и ?, и метасимволы [].

Напомню что запись ["\']? означает, что в этом месте может встретится одна двойная или одинарная кавычка, или же кавычек может не быть вовсе.

Как вам должно быть известно, после параметра href следует адрес страницы, на которую ссылается ссылка :)) Здесь важно правильно описать где заканчивается этот адрес. Если адрес заключен в кавычки, то кавычкой он и закончится )) А вот если адрес без кавычек то заканчивается он символом «больше» (>) или пробелом. Так и запишем – после выражения ["\']? нам может встретится что угодно кроме пробельного символа и символа >

<a\s+href\s*=\s*["\']?([^\s>]+?)

Кстати запись +? указывает, что нас интересует самое короткое совпадение с регулярным выражением.

Ну а дальше все просто ))) опять может встретится пресловутая кавычка:

<a\s+href\s*=\s*["\']?([^\s>]+?)["\']?

На случай, если HTML код ссылки содержит другие параметры (например target, class или id) – запишем что еще могут встретится любые символы в любой комбинации (в том числе могут и отсутствовать), которые обязательно закончатся знаком >

<a\s+href\s*=\s*["\']?([^\s>]+?)["\']?[.]*?>

Дальше идет анкор, состоящий из произвольного набора символов, и закрывающий тег </a>

<a\s+href\s*=\s*["\']?([^\s>]+?)["\']?[.]*?>(.*?)</a>

Осталось заключить это регулярное выражение в граничные символы с модификатором i для исключения влияния регистра:

#<a\s+href\s*=\s*["\']?([^\s>]+?)["\']?[.]*?>(.*?)</a>#i

Для поиска совпадений будем использовать функцию preg_match_all()

preg_match_all('#<a\s+href\s*=\s*["\']?([^\s>]+?)["\']?[.]*?>(.*?)</a>#i', $content, $matches)

после выполнения которой тексты, полностью совпавшие с регулярным выражением сохраняться в массиве $matches[0]это HTML-код ссылки полностью; все что совпало с первыми круглыми скобками сохранится в массиве $matches[1]это адреса на которые ссылаются ссылки; все что совпало со вторыми круглыми скобками сохранится в массиве $matches[2]это анкоры ссылок.

Приведенный ниже PHP скрипт осуществляет парсинг страницы сайта http://www.astronomynow.com и выводит построчно HTML код ссылки полностью, затем адрес, на который она ссылается и в третьей строке – анкор ссылки. И так для всех ссылок найденных на странице.

<? 
$url
="http://www.astronomynow.com";
$content=file_get_contents($url); 

$count=preg_match_all('#<a\s+href\s*=\s*["\']?([^\s>]+?)["\']?[.]*?>(.*?)</a>#i'$content$matches);


for(
$i=0$i<$count$i++)
{
    
$link htmlspecialchars($matches[0][$i]);
    
$href htmlspecialchars($matches[1][$i]);
    
$ancor htmlspecialchars($matches[2][$i]);
    echo 
"{$link}<br />";
    echo 
"{$href}<br />";
    echo 
"{$ancor}<br /><br />";
}
?>

Да! Регулярные выражения – это штука весьма мозгодробительная )) Но как видно и возможности открываются ОГРОМНЫЕ!

Все непонятки и вопросы задаем на форуме… там же спорим, ругаемся и восхищаемся )))

Чтобы оставить коментарий Вы должны зарегистрироваться, или войти, если Вы уже зарегистрированы

Комментариев (0)