我正在尝试通过正则表达式找到符合特定规则的render()
字符,以避免格式化降价解析。字符只应匹配在&
标记之外的位置(例如<>
),并且在括号之外且不会紧跟前导方括号,例如*<a href="...">*</a>*
。< / p>
适用于第一种情况的正则表达式的当前版本是:
*[*]()*
可以查看here。在这种情况下,第三行的第三场比赛不应该匹配。
此外,上面链接中的测试用例是为了不完全依赖外部网站:
/(\&)(?![^<]*>|[<>]*<\/)/gi
答案 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 & 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东西不需要它。