2009-10-01 7 views
0

Je voudrais un moyen de remplacer le texte de support partout sur une page avec un lien. Je sais que cela pourrait être fait sur le serveur avec php/etc, mais je serais en mesure d'inclure ce script pour pouvoir simplement être inclus et gérer le remplacement lui-même.Utilisez JS pour changer le texte entre parenthèses avec le lien à la page spécifiée

Par exemple:

Si [page = 12] se trouve dans la page que je voudrais lier à: changer à: http://www.example.com/pages/12 (un lien cliquable).

Merci!

+0

Ce n'est pas facile que vous pourriez penser. L'utilisation de 'innerHTML' est probablement lente et l'utilisation des opérations DOM est compliquée car vous devez remplacer un nœud de texte par trois nouveaux nœuds (texte, élément A, texte). – Gumbo

+0

Utilisez-vous des frameworks js? N'est-ce pas une chose php à faire? – Eric

+0

J'utilise jQuery. Oui je sais que la solution évidente est d'utiliser php, mais malheureusement, parce qu'il faut installer quelques sites différents, certains que je ne contrôle pas directement, je voudrais le rendre aussi simple que possible. Il suffit de leur demander d'inclure un seul fichier JS. – Rob

Répondre

1

Cela fonctionne comme je l'ai dans les commentaires:

var stack = [Array.prototype.slice.call(document.getElementsByTagName("body")[0].childNodes)], nodes, node, parent, text, offset; 
while (stack.length) { 
    nodes = stack.pop(); 
    for (var i=0, n=nodes.length; i<n; ++i) { 
     node = nodes[i]; 
     switch (node.nodeType) { 
      case Node.ELEMENT_NODE: 
       if (node.nodeName.toUpperCase() !== "SCRIPT") { 
        stack.push(Array.prototype.slice.call(node.childNodes)); 
       } 
       break; 
      case Node.TEXT_NODE: 
       text = node.nodeValue; 
       offset = text.indexOf("[page="); 
       if (offset >= 0 && text.substr(offset).match(/^(\[page=(\d+)\])/)) { 
        parent = node.parentNode; 
        var before = document.createTextNode(text.substr(0, offset)); 
         link = document.createElement("a"), 
         after = document.createTextNode(text.substr(offset + RegExp.$1.length)); 
        link.appendChild(document.createTextNode(text.substr(offset, RegExp.$1.length))); 
        link.setAttribute("href", "http://www.example.com/pages/" + RegExp.$2); 
        parent.insertBefore(after, node); 
        parent.insertBefore(link, after); 
        parent.insertBefore(before, link); 
        parent.removeChild(node); 
        stack.push([after]); 
       } 
     } 
    } 
} 
0
text.replace(/\[page=(\w+)\]/g, '<a href="http://example/pages/$1">http://example/pages/$1</a>') 

Quant à trouver partout sur la page, vous ne voulez pas vraiment faire ça.

0

Voici un regex pour le faire:

var str = "This is a link: [page=12]" 

str = str.replace(/\[page=([^\]]*)\]/g, 
    '<a href="www.example.com/pages/$1">www.example.com/pages/$1</a>'); 

Cela correspond [page = test] aussi bien.

Questions connexes