4

在 Javascript 函数中,我需要将所有不属于 HTML 标记的正斜杠替换为&#x2F.

有没有办法使用正则表达式来查找 a>和 a之间的所有正斜杠<

4

3 回答 3

2

不完全是,但如果你在这种修复中,我想你会对一个快速而肮脏的解决方案感到满意:/如果下一个出现的尖括号不是闭合尖括号,则查找一个。

result = subject.replace(/\/(?![^<>]*>)/g, "&#x2F");

当然,这是非常脆弱的——例如,它根本不关心注释、字符串等(然而,使用正则表达式很难做到这一点)。

于 2013-07-22T20:33:23.350 回答
1

您可以对此进行测试:

html ='<a href="/sdfsdf/SD/sdfsf">toto/tata</a>';

html = html.replace(/(<[^>]+>)|\//g,
    function (match, p1) { return (p1)?match:"&#x2f"; });

console.log (html);

这个想法是在尝试匹配斜杠之前捕获所有 html 标记(并自行替换)。然后一个回调函数测试第一个捕获组是否存在并返回完全匹配或替换。

您可以提高此模式的安全性以处理样式和脚本内容,如下所示:

html = html.replace(/(<s(tyle|cript)\b[\s\S]*?<\/s\2>|<[^>]+>)|\//gi,
    function (match, p1, p2) { return (p1)?match:"&#x2f"; });
于 2013-07-22T20:39:32.683 回答
0

这是一个很好的例子。首先点击谷歌:http: //james.padolsey.com/javascript/find-and-replace-text-with-javascript/

基本思想是遍历 DOM 中的所有节点并替换文本节点中的文本。此外,不要替换脚本、样式、元数据类型标签中节点中的任何文本。虽然你可以用一个大的正则表达式来做到这一点,但是当每个浏览器都内置了一个 dom 解析器时,在正则表达式中实现一个 dom 解析器没有多大意义。

function findAndReplace(searchText, replacement, searchNode) {
    if (!searchText || typeof replacement === 'undefined') {
        // Throw error here if you want...
        return;
    }
    var regex = typeof searchText === 'string' ?
                new RegExp(searchText, 'g') : searchText,
        childNodes = (searchNode || document.body).childNodes,
        cnLength = childNodes.length,
        excludes = 'html,head,style,title,link,meta,script,object,iframe';
    while (cnLength--) {
        var currentNode = childNodes[cnLength];
        if (currentNode.nodeType === 1 &&
            (excludes + ',').indexOf(currentNode.nodeName.toLowerCase() + ',') === -1) {
            arguments.callee(searchText, replacement, currentNode);
        }
        if (currentNode.nodeType !== 3 || !regex.test(currentNode.data) ) {
            continue;
        }
        var parent = currentNode.parentNode,
            frag = (function(){
                var html = currentNode.data.replace(regex, replacement),
                    wrap = document.createElement('div'),
                    frag = document.createDocumentFragment();
                wrap.innerHTML = html;
                while (wrap.firstChild) {
                    frag.appendChild(wrap.firstChild);
                }
                return frag;
            })();
        parent.insertBefore(frag, currentNode);
        parent.removeChild(currentNode);
    }
}

然后使用它

findAndReplace('\\/', '&#x2F');
于 2013-07-22T20:39:44.673 回答