在JavaScript Regex中查找标记之外的字符?

时间:2016-09-02 16:36:51

标签: javascript regex

我正在尝试通过正则表达式找到符合特定规则的render()字符,以避免格式化降价解析。字符只应匹配在&标记之外的位置(例如<>),并且在括号之外且不会紧跟前导方括号,例如*<a href="...">*</a>*。< / p>

适用于第一种情况的正则表达式的当前版本是:

*[*]()*

可以查看here。在这种情况下,第三行的第三场比赛不应该匹配。

此外,上面链接中的测试用例是为了不完全依赖外部网站:

/(\&)(?![^<]*>|[<>]*<\/)/gi

2 个答案:

答案 0 :(得分:0)

function processTextNodes(htmlString, callback) {
    var div = document.createElement('div');
    div.innerHTML = htmlString;

    var elements = [div];
    var element, child, i;

    while (elements.length) {
        element = elements.shift();
        for (i = 0; i < element.childNodes.length; i++) {
            child = element.childNodes[i];
            if (child.nodeType === element.ELEMENT_NODE) {
                elements.push(child);
            } else if (child.nodeType === element.TEXT_NODE) {
                child.textContent = callback(child);
            }
        }
    }

    return div.innerHTML;
}

使用

var html = 'hello <h1>This is a heading & a <span>nested value</span></h1> bye!';

processTextNodes(html, function (textNode) {
    return textNode.textContent.toUpperCase();
});

给你

"HELLO <h1>THIS IS A HEADING &amp; A <span>NESTED VALUE</span></h1> BYE!"

注意浏览器的HTML解析器是如何完成转义的。不要试图重新实现它,特别是不要使用正则表达式。世界上最强大的HTML解析器甚至可以处理任何类型的破坏输入,触手可及。使用它。

如果您不需要“过程文本节点值”部分,请将其删除并且该功能变得非常短:

function fixHTML(htmlString) {
    var div = document.createElement('div');
    div.innerHTML = htmlString;    
    return div.innerHTML;
}

答案 1 :(得分:0)

对于碰巧碰到这个问题的人来说,与本页上有人提出的建议相反,这并非不可能。在启用V8引擎中的实验性JavaScript功能后,我能够通过使用lookbehinds来获得它。转到chrome:// flags并检查Experimental JavaScript或使用--harmony选项运行node.js后,以下内容适用于Chrome。

/(?<!(?<=\[(.*))\]\(([a-zA-Z0-9\-\.\_\~\:\/\?\#\[\]\@\!\$\&\'\(\)\*\+\,\;\=\%]*))(\&)(?![^<]*>|[<>]*<\/)/gi

Example fiddle。 (必须在Chrome中启用Harmony才能正确查看)

希望lookbehinds能够进入下一个ECMAScript标准,因此其他实验性的JS东西不需要它。