Замена внешних ссылок на внутренние на PHP

В этой статье мы рассмотрим пример автоматического заменителя внешних ссылок на внутренние, написанном на PHP.

Данная система состоит из 2 частей.

1. Непосредственно сам заменитель, который пропускает HTML код текста через, так сказать фильтр, где все внешние ссылки заменяются на внутренние.

$fin = '#(<a[a-z\-_\s\"\#\=]*)(href="/)((https?|ftp)://)#i';
$replace = '$1 class="outurl" target="_blank" $2http://домен.ru/engine.php?url=$3';
$mytext=preg_replace($fin,$replace,$mytext);

Первые две строки данного кода это правило "что искать" ($fin) и "на что менять" ($replace), для удобности изменения данные строки с переменными вы можете прописать в файл который загружается всегда, например, config.php.

$fin содержит регулярное выражение, по которому находятся внешние ссылки.

$replace это то на что заменяется найденный пременной $fin кусок ссылки. Как видно из примера, всем внешним ссылкам будет присвоен класс outurl и внешние ссылки будут открываться в новом окне.

Последняя, третья строка является тем самым "фильтром" о котором говорилось ранее, именно он и заменяет все внешние ссылки в переменной $mytext на внутренние.

2. Переадресатор, который ловит нашу внутреннюю ссылку и отправляет пользователя по адресу бывшей внешней ссылки.

Наш переадресатор в данном случае, это engine.php, который содержит следующий PHP код:

if($_GET['url'])
{
$url = $_GET['url']; //
if (!$url)
{
$url = "http://вашдомен.ру";
}
if (!preg_match('#(https?|ftp)://\S+[^\s.,>)\];\'\"!?]#i',$url))
{
exit ("<p>Неверный формат запроса! Проверьте URL!</p>");
}
header("Location:$url");
exit();
}

Как и говорилось выше, вся задача данного файла в том чтобы перенаправить пользователя на конечный адрес.

Замена внешних ссылок с исключением

Способ в пункте 1 выше использовать можно, но лучше использовать его доработанную версию. Которая ниже. Дело в том что код представленный в пункте 1 также работает если ссылка внутренняя, но была написана в абсолютном виде. 

Вот собственно изменённый первый пункт:

$mytext=preg_replace('~(<a(?>.*?href))=(["\'])([a-z0-9]++://(?![a-z0-9\.]*?site\.ru).*?)\2~eSi', '"\1=\"http://site.ru/redirect.php?url=".base64_encode("$3")."\" target=\"_blank\"";', $mytext);

Это более крутой заменитель, который не просто подставляет в переменную внутреннего адреса внешний адрес, а дополнительно кодирует её в base64.

Для того чтобы система с этим заменителем работала исправно, тогда во втором пункте, в нашем переадресаторе замените:

 $url = $_GET['url'];

на

$url = base64_decode($_GET['url']);

Если же вы не желаете кодировать адрес внешней ссылки, просто замените ".base64_encode("$3")." (ИМЕННО С КАВЫЧКАМИ) на $3.

И чуть не забыл. Как вы наверное уже догадались site надо заменить на ваш сайт. Это и будет исключением, которое заменитель будет обходить.

Если у вас возникли какие-либо вопросы по данной теме, пишите в комментариях.


You have no rights to post comments

Карта сайта