Иногда перед программистом стоит не самая простая задача: найти все ссылки на странице с помощью PHP . Где это может быть нужно? Да, много где, например, при выводе одного сайта на другом. Для этого требуется вытащить из него все ссылки и заменить на другие. Также поиск ссылок используется при создании ЧПУ-ссылок ,...

Как найти все ссылки на странице через PHP

Иногда перед программистом стоит не самая простая задача: найти все ссылки на странице с помощью PHP. Где это может быть нужно? Да, много где, например, при выводе одного сайта на другом. Для этого требуется вытащить из него все ссылки и заменить на другие. Также поиск ссылок используется при создании ЧПУ-ссылок, ведь нужно вытащить все старые ссылки и поставить заместо них новые. В общем, задач можно придумать много, но ключевой вопрос всего один: "Как найти все ссылки на странице через PHP?". Об этом я и написал данную статью.

Кто имеет хотя бы маленький опыт, тут же скажет, что надо написать регулярное выражение и будет абсолютно прав. Действительно, простыми строковыми функциями данную задачу будет крайне трудно решить. Ведь каждый пишет по-разному, кто-то прописными бувами, кто-то строчными, кто-то ставит пробел после, например, знака "=", а кто-то нет. У кого-то двойные кавычки, а у кого-то одинарные. В общем, разновидностей очень много. И единственная возможность предусмотреть максимум всего - это регулярное выражение.

<?php
  /* $html - некий html-код некой страницы, \n - это переход на новую строку (верстальщики иногда это делают) */
  $html = "Текст <a href='page1.html'>ссылка</a> и снова <a hREF \n =\"page2.html\" title=''>ссылка</a> конец";
  /* Вызываем функцию, которая все совпадения помещает в массив $matches */
  preg_match_all("/<[Aa][\s]{1}[^>]*[Hh][Rr][Ee][Ff][^=]*=[ '\"\s]*([^ \"'>\s#]+)[^>]*>/", $html, $matches);
  $urls = $matches[1]; // Берём то место, где сама ссылка (благодаря группирующим скобкам в регулярном выражении)
  /* Выводим все ссылки */
  for ($i = 0; $i < count($urls); $i++)
    echo $urls[$i]."<br />";
?>

Самая сложная часть - это регулярное выражение, ради его публикации этот материал и создавалась, чтобы новичкам не пришлось писать нечто подобное. Хотя это и является очень полезным, но сразу новичок такое никогда не напишет, а для решения задачи это требуется. Конечно, данное регулярное выражение по поиску ссылок неидеальное (едва ли можно написать идеальное), но, думаю, что 99% ссылок будут найдены. А если код писал адекватный верстальщик, то все 100%. А как работать с найденными ссылками дальше, это уже отдельная история.