Замена внешних ссылок на внутренние на PHP
- Подробности
- Категория: PHP, MySQL, Java
- Опубликовано 15.01.2013 17:54
В этой статье мы рассмотрим пример автоматического заменителя внешних ссылок на внутренние, написанном на 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 надо заменить на ваш сайт. Это и будет исключением, которое заменитель будет обходить.
Если у вас возникли какие-либо вопросы по данной теме, пишите в комментариях.