Вот гибридное решение, которое дает вам прирост производительности innerHTML
и роскошь того, что вам не придется возиться со строками HTML при поиске совпадений:
function findMatchAndReplace(node, regex, replacement) {
var parent,
temp = document.createElement('div'),
next;
if (node.nodeType === 3) {
parent = node.parentNode;
temp.innerHTML = node.data.replace(regex, replacement);
while (temp.firstChild)
parent.insertBefore(temp.firstChild, node);
parent.removeChild(node);
} else if (node.nodeType === 1) {
if (node = node.firstChild) do {
next = node.nextSibling;
findMatchAndReplace(node, regex, replacement);
} while (node = next);
}
}
Введите:
<div id="foo">
this <b>is</b> a test
</div>
Процесс:
findMatchAndReplace(
document.getElementById('foo'),
/\b\w+\b/g,
'<a href="?q=$&">$&</a>'
);
Вывод ( пробел добавлен для ясности ):
<div id="foo">
<a href="?q=this">this</a>
<b><a href="?q=is">is</a></b>
<a href="?q=a">a</a>
<a href="?q=test">test</a>
</div>