Как добавить 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);
    }
Другие вопросы по тегам