function replaceTextInDomTree(root, searchRegEx, replace) {
    var node = root.firstChild;
    var nodesToChange = [];
    var pnode;
    while(node) {
        if (node.nodeType == 3) { // This is a Text node
            if (searchRegEx.test(node.nodeValue)) {
                pnode = node.parentNode;
                while (pnode.nodeType != 1) pnode = pnode.parentNode; // Find the parent node of type Element
                nodesToChange.push(pnode); // Store for later, since changes affect the iterator (node)
            }
        }
        if (node.hasChildNodes()) {
            // go down into the children
            node = node.firstChild;
        } else {
            while (!node.nextSibling) {
                node = node.parentNode;
                if (node == root) {break;}
            }
            node = node.nextSibling;
        }
    }
    for (var i=0; i < nodesToChange.length; i++) {
      nodesToChange[i].innerHTML = nodesToChange[i].innerHTML.replace(searchRegEx, replace);
    }
}

$(document).ready(function() {
  var supreg = '<sup class="registered">&reg;</sup>';
  var ptrn = new RegExp("(\xAE|&reg;)", "g");
  replaceTextInDomTree($('body')[0], ptrn, supreg);
});