Блог \ Полезные мелочи на PHP и jQuery \ Поиск внешних ссылок

Замена внешних ссылок на внутренние или как спрятать ссылку (Часть 2)

Первая часть урока: Редирект или как закрыть внешние ссылки от индексации.

Здравствуйте, в первой части урока мы создали файл exit.php в котором сделали редирект, но чтобы каждый раз в ручную не подставлять к ссылке "exit.php?url=" мы создадим регулярное выражение  с помощью которого автоматически найдем все внешние ссылки и заменим их на внутренние.

Итак часть 2 - "Регулярные выражения"

Для начала надо определиться, что будем искать с помощью регулярки. А искать будем все активные ссылки начинающиеся на HTTP:// , HTTPS:// или FTP:// .  Полезные функции на PHP - активная ссылка, по которой можно кликнуть. Теперь давайте разберем из чего состоит html код такой ссылки.

Без-имени-1

На рисунке видно что любая активная ссылка состоит из тэга <a и атрибута href="" , а остальные атрибуты, такие как: id, class, title и т.д используются не всегда, и могут быть как перед атрибутом href="", так и после него.

Теперь мы знаем что искать...

Наша задача указать регулярному выражению, чтобы оно искало: тег <a, затем любой текст с использованием символов (_ - = ") - этот текст может быть, а может и не быть, затем обязательно ищем href="(а тут надо найти HTTP:// , HTTPS:// или FTP://) и все. Тем самым мы будем знать, что это активная внешняя ссылка.

Собираем регулярку

Найдем тег <a и то, что можеть быть до атрибута href="" (class="" id="" и т.д).

Первая часть регулярки

Разберем по порядку (<a[a-z\-_\s\"\#\=]*)

  1. () - все что находится в круглых скобках - это группа
  2. <a - здесь мы говорим о том, что нужно искать совпадение символов <a
  3. [] - квадратные скобки говорят о диапазоне, т.е. [abc] - будет означать либо а, либо b либо с
  4. [a-z_"\-\s\=]* - строка может содержать символы в диапазоне от a до z_ , кавычки, тире, знак равно и \s - пробел. А * звездочка после квадратных скобок говорит о том, что данные символы могут встретиться ноль и более раз.

Затем ищем href="

Вторая часть регулярки

А после нужно указать, что протокол может быть: либо HTTP либо HTTPS либо FTP.

Третья часть регулярки

Здесь тоже все просто, указываем в скобках (https | ftp). символ | - означает "либо", тоесть либо https либо ftp. А после буквы s (httpS) ставим знак вопроса - это скажет о том, что буква S может быть 1 раз, или её может совсем не быть. А после протокола ставим ://

Регулярное выражение для поиска активных ссылок.

Регулярное выражение для поиска ссылок в тексте

Код

$regV = '#(<a[a-z\-_\s\"\#\=]*)(href=")((https?|ftp)://)#i';

Буква i в конце регулярки говорит о том, что поиск будет регистронезависимым, т.е. строка "АбВгД" ничем не будет отличаться от "абвгд".

Как использовать данный код:

Использовать мы его будем с функцией preg_replace().

У данной функции есть три параметра:

  1. Регулярное выражение
  2. На что меняем
  3. То что меняем

Рассмотрим пример:

$regV = '#(<a[a-z\-_\s\"\#\=]*)(href=")((https?|ftp)://)#i'; // регулярное выражение

$replace = '$1$2exit.php?url=$3'; // то на что заменяем

$text = 'Посмотрите пример <a href="http://www.makannikov.ru/blog.php">здесь</a>'; // текст (то что заменяем)
// В переменную $text, вы подставляете свой текст в котором хотите заменить ссылки

echo preg_replace($regV,$replace,$text); 

// Результатом выполнения данной функции будет:
// Посмотрите пример здесь
// Перед http мы подставили exit.php?url=

Объясняю что означает $1,$2 и $3 - это группы, для обозначения групп в регулярке, мы использовали круглые скобочки.

  • $1 - группа №1 (<a[a-z\-_\s\"\#\=]*)
  • $2 - группа №2 (href=")
  • $3 - группа №3 ((https?|ftp)://)
  • $4 - группа №4 (https?|ftp) - она находится внутри третьей группы 

На этом я завершаю данный урок, о том как создать страницу exit.php. смотрите здесь

Метки: регулярные выражения, замена внешних ссылок, поиск активных ссылок в тексте,

констанин

Всё это конечно хорошо и полезно. но может быть кто-нибудь знает плагин дла атозамены внешних ссылок на внутренние для joomla 2.5.9 БУДУ ПРИЗНАТЕЛЕН

Андрей

Константин, я к сожалению c Joomla не работаю, так что даже не могу подсказать в какую сторону смотреть.... Если чтонибудь подобное встречу, вышлю Вам на Email.

Антон

Добрый вечер Андрей! Очень пригодился данный пост! Применил у себя на сайте... Но не об этом!

 

Есть один очень нехороший момент: а если ссылка будет содержать в себе метод GET?

Например: <a href="http://www.makannikov.ru/blog.php?page=45&post_id=11">здесь</a>

 Тогда на страницу exit.php придет уже не правильный $_GET[url], следовательно есть смысл каждую ссылку обработать функцией urlencode()


А на странице exit.php следовательно $url = urldecode($_GET[url]);

 

Ваши комментарии!

Имя:*


Email:*


Email:*

Не будет показан

Текст:*



Немного о нас

Да, действительно теперь я не один. В моей команде работают несколько программистов, дизайнер и отличный SMM специалист.

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

*/ ?>

Пишите!