2016-06-16 9 views
0

私は3つのリンクを含む次のHTML文字列を持っている:javascriptを使って私のドメインに関連していないすべての外部リンクに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">Go google</a> 
'; 

私のドメイン名がexample.comです。上のコードから分かるように、2つの内部リンクと1つの外部リンクがあります。

私はすべての外部リンク(ない内部のもの)に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

私はあなたのニーズに上記の機能を修正しました。あなたのホワイトリストにいくつかの微調整を加えて、 – Anubis

+0

ありがとう。この強力なソリューションですか?何とかそれをハックすることは可能ですか?私はそれを生産することを祈っています – Erik

関連する問題