Записи с метками ‘noindex’

Автоматическое добавление noindex ко внешним ссылкам на PHP

Четверг, 25 Июнь 2009

Сегодня на работе столкнулся со следующей задачей: на разработанном нами сайте потребовалось закрыть все внешние ссылки тэгом <noindex>, обычно это делают для того, чтобы вес страниц не уходил на сторонние ресурсы.
При разработке сайта таких задач не ставилось и все тексты добавлялись без этих требований.
Сайт разрабатывался давно и содержит довольно мноо текстовых документов со внешними ссылками.
Оценив объём стало ясно, что вручную проставить <noindex> — очень большая работа в процессе которой могут быть допущены ошибки.
Решил написать скрипт, который бы обрабатывал HTML-текст и автоматически проставлял вокруг внешних ссылок.
Хотя я и не монстр в регулярных веыражениях и пишу их по справочнику, функцию выполняющую мою задачу написал быстро, ниже привожу её код.

&lt;?php
function processLinksCallback($matches){
$link=$matches[0];
if(strpos($link, &quot;http://&quot;)&gt;0 &amp;&amp; strpos($link, $_SERVER[&quot;HTTP_HOST&quot;])===false){
$link=&quot;&lt;noindex&gt;&quot;.$link.&quot;&lt;/noindex&gt;&quot;;
}
return $link;
}
function processLinks($txt){
return preg_replace_callback('/\&lt;a(.*?)\&lt;\/a\&gt;/i', &quot;processLinksCallback&quot;, $txt);
}
?&gt;

Для того, чтобы её использовать, необходимо содержимое всей страницы собрать в PHP-переменную $txt.
Сделать это можно добавив в самом начале скрипта код ob_start();, а в самом конце $txt=ob_get_clean();
Затем нужно прогнать эту переменную через функцию processLinks и вывести результат.
Получается следующий код страницы:

&lt;?php
function processLinksCallback($matches){
$link=$matches[0];
if(strpos($link, &quot;http://&quot;)&gt;0 &amp;&amp; strpos($link, $_SERVER[&quot;HTTP_HOST&quot;])===false){
$link=&quot;&lt;noindex&gt;&quot;.$link.&quot;&lt;/noindex&gt;&quot;;
}
return $link;
}
function processLinks($txt){
return preg_replace_callback('/\&lt;a(.*?)\&lt;\/a\&gt;/i', &quot;processLinksCallback&quot;, $txt);
}
ob_start();

//код вашей страницы
//...

$txt=ob_get_clean();
$txt=processLinks($txt);
echo($txt);
?&gt;

Функцию очень удобно использовать, если весь вваш сайт работает через единую точку входа, т.е. независимо от адреса страницы выполняется один общий скрипт.

Надеюсь, данная функция будет кому-нибудь полезна.
Сам искал в интернете готовое решение — не нашлось.

Доработанные функции, добавляющие rel=nofollow:

function processLinksCallback($matches){
 $link=$matches[0];
 if(strpos($link, &quot;&lt;a href=&quot;http://&amp;quot;)&gt;0&quot;&gt;http://&quot;)&gt;0&lt;/a&gt; &amp;&amp; strpos($link, $_SERVER[&quot;HTTP_HOST&quot;])===false){
  $link_with_nofollow=str_replace(&quot;href=&quot;,&quot; rel='nofollow' href=&quot;, $link);
  $link=&quot;&lt;noindex&gt;&quot;.$link_with_nofollow.&quot;&lt;/noindex&gt;&quot;;
 }
 return $link;
}
function processLinks($txt){
 return preg_replace_callback('/\&lt;a(.*?)\&lt;\/a\&gt;/i', &quot;processLinksCallback&quot;, $txt);
}