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]);
}
}
}
}
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
Utilisez-vous des frameworks js? N'est-ce pas une chose php à faire? – Eric
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