在JavaScript正则表达式中查找标记之外的字符?
我试图通过正则表达式查找在JavaScript正则表达式中查找标记之外的字符?,javascript,regex,Javascript,Regex,我试图通过正则表达式查找&字符,这些字符符合特定规则,以避免标记解析的格式设置。仅当字符位于标记之外(例如***)和括号之外时,才应匹配字符,括号前面没有前导方括号,例如*[*]()*) 适用于第一种情况的正则表达式的当前版本为: /(\&)(?![^<]*>|[<>]*<\/)/gi /(\&)(?![^ |[]* 对于任何碰巧遇到这个问题的人来说,与本页上的人所建议的相反,这不是不可能的。在V8引擎中启用了实验性JavaScript功能后,我通过使用l
&
字符,这些字符符合特定规则,以避免标记解析的格式设置。仅当字符位于
标记之外(例如***
)和括号之外时,才应匹配字符,括号前面没有前导方括号,例如*[*]()*
)
适用于第一种情况的正则表达式的当前版本为:
/(\&)(?![^<]*>|[<>]*<\/)/gi
/(\&)(?![^ |[]* 对于任何碰巧遇到这个问题的人来说,与本页上的人所建议的相反,这不是不可能的。在V8引擎中启用了实验性JavaScript功能后,我通过使用lookbehinds获得了这个问题。以下内容将在chrome://flags 并检查实验JavaScript
或使用--harmony选项运行node.js
/(?<!(?<=\[(.*))\]\(([a-zA-Z0-9\-\.\_\~\:\/\?\#\[\]\@\!\$\&\'\(\)\*\+\,\;\=\%]*))(\&)(?![^<]*>|[<>]*<\/)/gi
/(?|[]*是我多年来见过的格式最好的[regex]问题之一。“…应该只在…和括号之外匹配,而不是在括号前面加上前导方括号”-这不是意味着第三行的第三个实例应该匹配吗?它在括号内,前面紧跟着方括号。@ChrisPeacock我修改了措辞,使其不那么不精确。@Tomalak我并不是想用正则表达式解析HTML,我只是想在字符出现之前用&;
转义我正在使用的降价处理器,因为它本身不这样做(它将它们保留为&
,这意味着有人可以键入一个包含&
的代码块,然后返回&
而不是&
——这对于代码块或任何其他地方来说都不是理想的,因为代码块中会运行以代码为中心的内容。@Tomalak我知道问题已经解决了,但也不是这样的。欲望d大小写只是“在这些类型的封闭字符之外”加上“如果前面有”在其中一个上。这离尝试跳转到HTML/XML文档还差得远。这将向页面中注入未跳转的HTML-这比在遇到降价解释器之前使用正则表达式进行预处理更大的安全问题。这与我的代码将在node.js中运行这一事实无关,因此这甚至不是一个选项。它不会做任何事情nd.div
从未附加到页面上。此外,HTML字符串中的所有脚本标记都将被剥离。node有HTML DOM,您可以毫不改动地运行此代码。它仍然不是一个远程JavaScript
解决方案。我不知道您在说什么。这是JavaScript代码,它生成正确的结果。有一些节点的DOM实现,请使用其中一个。您忽略了一点,即不能使用正则表达式进行HTML解析。这不是“我不知道如何”类型的无法完成,而是“不可能”无法执行的类型。如前所述,您成功删除了注释:这不是JavaScript
解决方案-这依赖于浏览器依赖项,在node.js中不起作用。您可以在删除的注释中使用node.js模块来实现这一点,但这是一个巨大的依赖项要求因此,对于一些不需要添加模块依赖项就可以轻松完成的事情,顺便说一句,这不是不可能的,我做到了,稍后将发布如何完成。
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!"
function fixHTML(htmlString) {
var div = document.createElement('div');
div.innerHTML = htmlString;
return div.innerHTML;
}
/(?<!(?<=\[(.*))\]\(([a-zA-Z0-9\-\.\_\~\:\/\?\#\[\]\@\!\$\&\'\(\)\*\+\,\;\=\%]*))(\&)(?![^<]*>|[<>]*<\/)/gi