2016-06-16 13 views
0

У меня есть следующий HTML строка с тремя звеньями:Как добавить rel = "nofollow" ко всем внешним ссылкам, которые не связаны с моим доменом с помощью javascript?

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">'); 
} 

К сожалению, мое регулярное_выражение кажется does't работы. После выполнения addNoFollowsToExternal(html)rel="nofollow" не прилагаются к внешней ссылке с href="https://google.com"

Пожалуйста, помогите мне с исправлением моего регулярного выражения для решения моей задачи.

ответ

4

В вашем 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">'); 
} 
+0

Спасибо за помощь. Возможно ли перечислить все поддомены в массиве 'whiteList', но просто используйте' * .example.com' например? – Erik

+0

Я модифицировал вышеуказанную функцию в соответствии с вашими потребностями, удалив www. часть из регулярного выражения и добавление некоторых настроек в ваш белый список – Anubis

+0

Спасибо. Является ли это надежным решением? Можно ли это как-то взломать? Я прошу, потому что планирую использовать его n production – Erik