Как добавить rel="nofollow" ко всем внешним ссылкам, которые не связаны с моим доменом с помощью JavaScript?
У меня есть следующая строка HTML с тремя ссылками:
var html = '
<a href="http://www.example.com/help">Go to help page</a>
<a href="http://blog.example.com">Go to blog page</a>
<a href="https://google.com">Go google</a>
';
Мое доменное имя example.com
, Как видно из кода выше, есть две внутренние ссылки и одна внешняя.
Мне нужно написать "волшебную" функцию, которая добавляет rel="nofollow"
атрибут для всех внешних ссылок (не внутренних). Поэтому мне нужно получить следующий результат:
var html = '
<a href="http://www.example.com/help">Go to help page</a>
<a href="http://blog.example.com">Go to blog page</a>
<a href="https://google.com" rel="nofollow">Go google</a>
';
Я пытаюсь написать эту функцию, и это у меня есть в то время:
function addNoFollowsToExternal(html) {
// List of allowed domains
var whiteList = ['example.com', 'blog.example.com'];
// Regular expression
var str = '(<a\s*(?!.*\brel=)[^>]*)(href="/https?://)((?!(?:(?:www\.)?' + whiteList.join(',') + '))[^"]+)"((?!.*\brel=)[^>]*)(?:[^>]*)>',
// execute regexp and return result
return html.replace(new RegExp(str, 'igm'), '$1$2$3"$4 rel="nofollow">');
}
К сожалению, мое регулярное выражение не работает. После выполнения addNoFollowsToExternal(html)
rel="nofollow"
не добавляется во внешнюю ссылку с href="https://google.com"
Пожалуйста, помогите мне исправить мое регулярное выражение, чтобы решить мою задачу.
2 ответа
Решение
В вашем RegEx были небольшие ошибки. Вот исправленная версия:
function addNoFollowsToExternal(html){
var whiteList = ['([^/]+\.)?example.com'];
var str = '(<a\s*(?!.*\brel=)[^>]*)(href="https?://)((?!(?:' + whiteList.join('|') + '))[^"]+)"((?!.*\brel=)[^>]*)(?:[^>]*)>';
return html.replace(new RegExp(str, 'igm'), '$1$2$3"$4 rel="nofollow">');
}
Вы также можете использовать функцию ниже
private function _txt2link($text){
$regex = '/'
. '(?<!\S)'
. '(((ftp|https?)?:?)\/\/|www\.)'
. '(\S+?)'
. '(?=$|\s|[,]|\.\W|\.$)'
. '/m';
return preg_replace_callback($regex, function($match)
{
return '<a'
. ' target="_blank"'
. ' rel="nofollow"'
. ' href="' . $match[0] . '">'
. $match[0]
. '</a><br/>';
}, $text);
}