2016-06-16 20 views
0

Ich habe den folgenden HTML-String mit drei Links:Wie füge ich rel = "nofollow" zu allen externen Links hinzu, die nicht zu meiner Domain mit Javascript gehören?

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> 
'; 

Mein Domain-Name ist example.com. Wie Sie aus dem obigen Code sehen können, gibt es zwei interne Links und einen externen.

Ich muss "magische" Funktion schreiben, die rel="nofollow" Attribut zu allen externen Links (nicht interne) hinzufügt. Also muss ich das folgende Ergebnis erhalten:

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> 
'; 

ich diese Funktion zu schreiben, ich versucht, und das ist mir damals haben:

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

Leider ist mein regexp does't Arbeit scheint. Nach der Ausführung addNoFollowsToExternal(html)rel="nofollow" nicht hinzugefügt, um externe Verbindung mit href="https://google.com"

Bitte helfen Sie mir bei der Festlegung meiner regulären Ausdruck, um meine Aufgabe zu lösen.

Antwort

4

Es gab einige kleinere Fehler in Ihrer RegEx. Hier ist eine korrigierte Version:

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

Danke für die Hilfe. Ist es möglich, nicht alle Subdomains im Array 'whiteList' aufzulisten, sondern zum Beispiel' * .example.com' zu verwenden? – Erik

+0

Ich habe die obige Funktion an Ihre Bedürfnisse angepasst, indem ich das www entfernt habe. Teil von der Regex und fügen Sie einige Optimierungen zu Ihrer Whitelist – Anubis

+0

Danke. Ist diese robuste Lösung? Ist es möglich, es irgendwie zu hacken? Ich frage, weil Planung, es n Produktion zu verwenden – Erik