preg_replace - добавить для внешних ссылок noindex + nofollow

12
Shtogrin
На сайте с 02.11.2006
Offline
95
4010

Попросили в ЛС написать регулярное выражение для добавления <noindex> и rel="nofollow" к внешним ссылкам. Может еще кому-то пригодится, может кто-то напишет проще.

Закрыть все ссылки, которые начинаются с http://

$data=preg_replace('#<a([^<]*)href=["\']http://([^"\']*)["\']([^<]*)>(.*)</a>#ismU',

'<noindex><a$1href="http://$2"$3 rel="nofollow">$4</a></noindex>', $data);

Закрыть все ссылки, которые начинаются с http://, кроме кроме http://localhost и http://www.localhost

$data=preg_replace('#<a([^<]*)href=["\']http://(?!localhost|www\.localhost)([^"\']*)["\']([^<]*)>(.*)</a>#ismU',

'<noindex><a$1href="http://$2"$3 rel="nofollow">$4</a></noindex>', $data);
www.shtogrin.com (http://www.shtogrin.com/). Канцтовары (http://www.invit.com.ua/). 1С Бухгалтерия (http://account.kiev.ua/).
Progr@mmer\.
На сайте с 14.10.2007
Offline
44
#1

В аргументе replacement при указании кавычки перед http:// и после ее лучше использовать ссылку на эту кавычку. Плюс в search аргументе нужно использовать маску с выбором "|", примерно так ("|\'|), оставив одно пустое значение, потому что некоторые люди не используют кавычки в href'e.

Полностью написать не могу, с телефона сейчас.

Вашей девушке не хватает романтики? Черпните её на сайте «Я Люблю Романтику» (http://iloveromantics.ru/). Романтический форум (http://forum.iloveromantics.ru/) для отдыха от нудной работы.
S
На сайте с 09.10.2007
Offline
186
#2

href может быть без кавычек, тут не учтено, как и многое другое, как то например

a href="http://url/param1'param2"

ваш регэксп словит одинарную кавычку, хотя она часть урла

Удобная панель для доменных имен (http://panel.started.ru/) с массовыми операциями. Индивидуальные цены по запросу.
euhenio
На сайте с 21.09.2001
Offline
357
#3
Попросили в ЛС написать

-ну и зря.

1. href м.б. без кавычек, уже сказали

2. ([^<]*) до и после ссылки - галка не в ту сторону, и до текста ссылки лучше +, после < a д.б. пробел

3. в тексте href надо отменить пробелы и > (на случай, если вокруг href кавычек нет)

4. (.*) в тексте ссылки - это жесть! Он зохавает все до конца документа, самого последнего < /a>... :)

мой вар-т (что такое mU не знаю)

$data=preg_replace('#<a([^>]+?)href\s*=\s*(["\']*)\s*http://([^"\'\s>]+)\s*\\2([^>]*?)>(.*?)</a>#is', 

'<noindex><a$1href=$2http://$3$2$4 rel="nofollow">$5</a></noindex>', $data);
с ув., Евгений Трофименко seo блог Trofimenko.ru ( http://trofimenko.ru/ ) но ыыы мало обновляется... Tools.Promosite.ru - анализатор апдейтов Яндекса (пожертвуйте лимиты на Яндекс.XML! ( https://searchengines.guru/ru/forum/801888/page7#comment_11942489 )) Konvr.ru - увеличение конверсии сайта на 81% за 4 недели ( http://konvr.ru/ )
Shtogrin
На сайте с 02.11.2006
Offline
95
#4

euhenio, U - как раз делает рег. выражения жадными и (.*) в href обрабатывается правильно. Насчет отсутствия кавычек, может быть согласен, но считаю что кавычке все же надо ставить.

simka, В адресе не должно быть ни ' = %27 ни " = %22

euhenio
На сайте с 21.09.2001
Offline
357
#5
Shtogrin:
U - как раз делает рег. выражения жадными и (.*)

-Жадными? они по умолчанию жадные, и при этом как раз захавается весь документ.

S
На сайте с 09.10.2007
Offline
186
#6
Shtogrin:
euhenio, U - как раз делает рег. выражения жадными и (.*) в href обрабатывается правильно. Насчет отсутствия кавычек, может быть согласен, но считаю что кавычке все же надо ставить.

simka, В адресе не должно быть ни ' = %27 ни " = %22

Ага, не должно. Но на практике все, кто чтото не должен это прощают. Бывают такие случаи, что вообще...

Shtogrin
На сайте с 02.11.2006
Offline
95
#7
euhenio:
-Жадными? они по умолчанию жадные, и при этом как раз захавается весь документ.

да не жадными (PCRE_UNGREEDY), с U выражение не будет захватывать весь документ

_
На сайте с 28.12.2004
Offline
156
#8

Это я спросил топикастера, и огромное ему спасибо за грамотные советы 🚬

Но у меня обе вышеприведенные конструкции не работают как задумано. В обоих случаях закрываются все ссылки в тексте...

Изначально у меня был код, который вставляет во внешние ссылки rel="nofollow":

$data = preg_replace("/a href=\"(.+?)\"/","a href=\"\\1\" rel=\"nofollow\"",$data);

Внутренние ссылки он не трогает ☝ (доказано практическим путем).

Shtogrin
На сайте с 02.11.2006
Offline
95
#9

возьмите код euhenio

$data=preg_replace('#<a([^>]+?)href\s*=\s*(["\']*)\s*http://([^"\'\s>]+)\s*\\2([^>]*?)>(.*?)</a>#is',
'<noindex><a$1href=$2http://$3$2$4 rel="nofollow">$5</a></noindex>', $data);
_DXlink:
Изначально у меня был код, который вставляет во внешние ссылки rel="nofollow".
$data = preg_replace("/a href=\"(.+?)\"/","a href=\"\\1\" rel=\"nofollow\"",$data);
Внутренние ссылки он не трогает (доказано практическим путем).


<?php
$data='<a href="/">link</a>';
$data = preg_replace("/a href=\"(.+?)\"/","a href=\"\\1\" rel=\"nofollow\"",$data);
echo $data;

результат:
<a href="/" rel="nofollow">link</a>
?>
_
На сайте с 28.12.2004
Offline
156
#10

Пробовал, код euhenio тоже применяется ко всем ссылкам... Возможно, особенность при формировании ссылки в движке сайта (Битрикс).

А можно как-то добавить условие для noindex в существующий код?

$data = preg_replace("/a href=\"(.+?)\"/","a href=\"\\1\" rel=\"nofollow\"",$data);
12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий