用Javascript正则表达式查找>以及<

Javascript regex to find forward slashes between > and <

本文关键字:以及 lt Javascript gt 查找 正则表达式      更新时间:2023-09-26

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

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

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

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

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

您可以测试以下内容:

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"; });

这里有一个很好的例子。首次登陆谷歌:http://james.padolsey.com/javascript/find-and-replace-text-with-javascript/

其基本思想是遍历DOM中的所有节点,并在文本节点中替换文本。此外,不要替换脚本、样式、元数据类型标记中节点中的任何文本。虽然您可以用一个大的regex来实现这一点,但当每个浏览器中都内置了一个dom解析器时,用regex实现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');