Nikol Tesla

помогите обернуть чужие ссылки (не моего домена) nofollow и noindex

Recommended Posts

:blink: а вы ничего не путаете?

неа. У меня форум с 1000 IP в сутки. И я не хочу терять вес страницы и дарить его каждому кто закинет ссылку.

Share this post


Link to post
Share on other sites

Понятно. Неправильно понял я. Как мне кажется, большинство форумных движков имеют такую встроенную функцию, а если ее нет, то вопрос нужно адресовать в раздел движков. имхо.

Share this post


Link to post
Share on other sites

Я тоже не мастер регулярок, но вроде работает, вот пример:


$domen = 'site.ru';
$patern = '<a.*href="(http:\/\/(?!www\.'.$domen.'|'.$domen.').*?)".*>.*?<\/a>';
$text = file_get_contents('doc.html');

preg_match_all('/'.$patern.'/', $text, $match);
Echo "<pre>\n".print_r($match[1], true)."\n</pre>";

Share this post


Link to post
Share on other sites

Понятно. Неправильно понял я. Как мне кажется, большинство форумных движков имеют такую встроенную функцию, а если ее нет, то вопрос нужно адресовать в раздел движков. имхо.

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

Share this post


Link to post
Share on other sites

Я тоже не мастер регулярок, но вроде работает, вот пример:


$domen = 'site.ru';
$patern = '<a.*href="(http:\/\/(?!www\.'.$domen.'|'.$domen.').*?)".*>.*?<\/a>';
$text = file_get_contents('doc.html');

preg_match_all('/'.$patern.'/', $text, $match);
Echo "<pre>\n".print_r($match[1], true)."\n</pre>";

вообще левый код :) Мне только и надо что определить домен в ссылке юзера в его сообщении и если домен не фига не мой, то экранить ссылку

<!--noindex-->Текст или код, закрываемый от индексации Яндекс/Рамблер<!--/noindex-->

а в саму ссылку пихать rel="nofollow"

Share this post


Link to post
Share on other sites

$data='example: [url=http://kamrbb.ru/1.php]grdfgdfgfdg[/url]';
$data=str_replace('[/url]',"`",$data);

$A='/\[url=([а-яёA-Za-z0-9\.\/_?#&%=;,~:\+\-]*)\]([^`]*)`/i';

while(preg_match($A, $data)){

echo $marr[0][0];

preg_match_all($A, $data, $marr, 2);

$m = $marr[0][1];

if(!preg_match('/kamrbb\.ru/i',$m)){
$B='<!--noindex--><a rel="nofollow" target=_blank href="\\1"><u>\\2</u></a><!--/noindex-->';
}else{
$B='<a target=_blank href="\\1"><u>\\2</u></a>';
}

$m=preg_replace($A,$B,$marr[0][0]);

$data=str_replace($marr[0][0],$m,$data);

}

echo $data;

Сам написал за несколько мучительных часов с учебником PHP.

$text = 'ffef http://www.flashboot.ru/index.php efeffefefef http://forum.htmlbook.ru ddsds http://a.kamrbb.ru ssd';

$A='/( |^|`)(http:\/\/[а-яА-ЯA-Za-z0-9\/_\?\!#\&%\=;,:\+\.\-]*)( |`|$)/';
while(preg_match($A, $text)){
echo $marr[0][0];
preg_match_all($A, $text, $marr, 2);
$m = $marr[0][1];
if(!preg_match('/kamrbb\.ru/i',$m)){
$B='<!--noindex-->\\1<a rel="nofollow" target=_blank href="\\2">\\2</a>\\3<!--/noindex-->';
}else{
$B='\\1<a target="_blank" href="\\2">\\2</a>\\3';
}
$m=preg_replace($A,$B,$marr[0][0]);
$text=str_replace($marr[0][0],$m,$text);
}

echo $text;

где то я косякнул((( множит ссылки если есть вложения картинок...

Edited by Nikol Tesla

Share this post


Link to post
Share on other sites


$domen = 'site.ru';
$patern = '<a.*href="(http:\/\/(?!www\.'.$domen.'|'.$domen.').*?)".*>.*?<\/a>';
$text = file_get_contents('doc.html');

preg_match_all('/'.$patern.'/', $text, $match);
Echo "<pre>\n".print_r($match[1], true)."\n</pre>";

вообще левый код :) Мне только и надо что определить домен в ссылке юзера в его сообщении и если домен не фига не мой, то экранить ссылку

<!--noindex-->Текст или код, закрываемый от индексации Яндекс/Рамблер<!--/noindex-->

а в саму ссылку пихать rel="nofollow"

Код не левый, он просто по-видимому не постижим вашей ментальности.

Я поясню: здесь нет готового решения для вас, но так как вы написали что у вас плохо с регулярками я написал её за вас.

Эта регулярка отыскивает все ссылки ссылающиеся на чужие домены, в переменную $domen нужно вписывать свой домен без префикса www

С этим массивом можно легко реализовать то что вам надо, стоит только немного подумать, совсем чуть-чуть.

Код привёл как пример, а не как готовое для копипаста решение.

P.S. А вот ваш код действительно - бугагашенька :lol:

Share this post


Link to post
Share on other sites

Здравствуйте!

Получилось решить задачу?

Ищу готовое решение.

Задача такая же обернуть все внешние ссылки в <noindex> и добавить в ссылку rel='nofollow'.

Также нельзя трогать ссылки без http или https, т.к. часто внутренние ссылки делал сокращенно. А так же есть и якоря внутри страниц. И сайт был сначала http, а теперь https.

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

1. Найти тег </a>.
2. Сохраняем в переменную кусок текста с закрывающим тегом </a>, а оставшийся текст в другую переменную.
3. Проверить на http (если нет, ищем тег в оставшийся части текста)
4. Если есть http проверить на наличие site после <a. Если нет к п.1.
5. Если нет site,  сделать автозамену  "<a" на "<noindex><a rel='nofollow' " и </a> на "</a></noindex>".
6. Переходим к п. 1.

 

Share this post


Link to post
Share on other sites

Помогите пожалуйста доработать регулярное выражение. Что бы автозамена не трогала также ссылки где нет http(s) в начале.

<?php
$text = 'ffef <a href="https://www.flashboot.ru/index.php">ссылка 1 с заменой</a> 
<a href="http://forum.htmlbook.ru">ссылка 2 с заменой</a> текст текст 
<a href="http://moysite.ru/bbb/aaa/ggg.html">моя ссылка без замены</a> kf kf kf<br />
текст <a href="/index.php">внутренняя ссылка</a><br />
<a href="#p1">ссылка на якорь</a>';

$regex = '%(<a\shref="(?!https?://moysite\.ru))(.*?</a>)%i';
$replacement = '<noindex><a rel="nofollow" href="$2</noindex>';
$result = preg_replace($regex, $replacement, $text);
echo $result;
?>

 

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Member Statistics

    46,367
    Total Members
    3,128
    Most Online
    EugeneWebdev
    Newest Member
    EugeneWebdev
    Joined
  • Recently Browsing   0 members

    No registered users viewing this page.



  • Спрашивают сейчас

  • Пишут сейчас

    • Когда есть с кем, и есть куда, хожу на настольный теннис. Когда два раза в неделю, а когда и два раза в месяц. Сейчас в универе, где мы играли, отпуска, а другие места или ужасные (плиточный пол, например), или рано закрываются. Самая проблема — это найти себе напарника своего уровня, готового регулярно заниматься. Энтузиазм почему-то есть только у тех, кто ещё только учится ракетку держать, а я держать уже могу, мне надо играть учиться.
    • Увеличилась. Не 1000 долларов, конечно, и в рублях, но семье есть, что покушать. Меня держит то, что я больше ничего не умею. Продавцом в супермаркете я не выдержу, с людьми взаимодействовать вообще не люблю, у меня для этого менеджер, с которым я тоже не люблю взаимодействовать. По образованию мне положено работать на заводе, но нас в универе не учили ничему, что помогло бы сразу пойти и работать, дали только некоторые теоретические азы, которые я давно забыл. А для качественной работы, я считаю, нужно иметь не азы, а понимание сути происходящего. Лично я вообще не научился понимать, зачем в цепи, скажем, резистор стоит, или где его нужно поставить и зачем. Особенно, когда нам начинали рассказывать, и у каждого резистора по 2-3 назначения, эдак поставишь его куда-нибудь, а он аукнется смещением постоянного напряжения где-то в другом конце схемы.
      Новые фреймворки, можно сказать, не учу, хотя надо бы, без них я работу сменить не смогу, если приспичит, но у меня не остаётся моральных сил после работы ещё что-то учить. Я даже на велосипеде ездить перестал.
      В программировании у меня, к сожалению, тоже азы с некоторой специализацией в вёрстке. Я не знаю многих тонкостей, и никогда, например, не углублялся в такие темы, где понадобились бы Reflection в PHP. Или, например, я люблю использовать SQL-запросы вместо ORM, потому что польза ORM для меня не пересиливает их многословность и косноязычность. Я, конечно, понимаю, что если следовать принятым стандартам, то потом легче дорабатывать код, но я пришёл в разработку из домашних проектиков, и так и не научился наслаивать абстракции ради стандартов. А, скажем, вебпак только позавчера стал поковыривать, чтобы понимать, что в нём вообще происходит, а то он сейчас везде. Настолько некрупные проекты у меня всегда были, что мне хватало отдельных JS-файликов.

      И вообще, когда я с условного Delphi переходил на веб, то меня привлекало то, что не нужно ничего компилировать, не нужно ничего ставить, можно лишь запустить блокнот, а браузер уже есть на любом компьютере. Теперь этого ничего уже нет, постоянно то npm, то composer, сборка vue, сборка scss, когда без vue. У питонщиков и ноды, так вообще, веб-сервер является частью проекта, и чтобы что-то исправить, надо его перезапускать, а не как в PHP, просто файлик подправить. Веб перестал быть простым.
    • Всем привет. Слышал советы, что вместо пикселей желательно использовать rem для задания размеров. Решил, в качестве эксперимента, попробовать задать для html определённый размер в пикселях, а дальше везде использовать уже rem. И вроде всё нормально, даже очень удобно. Но под конец решил я уменьшить масштаб страницы и вот тут появились проблемы. Если использовать такой код: html { font-size: 10px; } .box { background: red; width: 100px; height: 400px; } То по итогу всё нормально, сколько масштаб не уменьшай, результат всё те же 400px. Но стоило изменить единицы измерения в высоте: html { font-size: 10px; } .box { background: red; width: 100px; height: 40rem; } И вот тут уже появляется проблема. При уменьшении масштаба страницы до 50% к размеру высоты: в Google Chrome и Yandex браузерах добавляется дополнительные 80px, в Opera итоговая высота элемента увеличивается до 960 px. А вот в Firefox всё нормально и по итогу выходят те же 400px. Подскажите в чём тут проблема? Это особенности rem или браузеров на основе WebKit? И вообще, я понимаю, что многие советуют явно высоту элементов не задавать, но если это необходимо, то какие единицы измерения посоветуете для этого использовать?
  • Popular Contributors