Javascript 在引号之间匹配HTML打开标记
我有下面的小html代码:Javascript 在引号之间匹配HTML打开标记,javascript,html,regex,Javascript,Html,Regex,我有下面的小html代码: <span class="k">function</span> () { <span class="k">this</span>.test = '<p><span>test</span></p>'; } function(){this.test='test';} 这个正则表达式: /["|'](<)|(<)(?:\/[^>]>)["|']/g
<span class="k">function</span> () { <span class="k">this</span>.test = '<p><span>test</span></p>'; }
function(){this.test='test';}
这个正则表达式:
/["|'](<)|(<)(?:\/[^>]>)["|']/g
/[“|”]()[“|”]/g
使用这个正则表达式,它返回两个匹配的结果,但我想要的是匹配引号之间的所有html打开标记,并将它们分组为一个结果。这样做的正确正则表达式是什么?
我需要在之后用
替换那些打开的标签。
提前谢谢 这里有一个正则表达式,用于在单引号内获取
s:
result = result.replace(/(?=[^']*'[^']*$)>/g, '>');
代码段(您将看到
符号):
var str='function(){this.test=\'test\';}';
var result=str.replace(/(?=[^']*'[^']*$)您已经“破坏”了HTML,在一个带引号的字符串中包含HTML标记。正如一些评论员所建议的那样,这将使得无法用HTML解析器解析字符串——原则上它们是正确的,但在这种情况下不起作用
这个HTML片段是从哪里来的?最好的选择是在工作流中的某个早期点将HTML转义到引号中,这样就不必编写难看的regexp来解开它
如果您真的想使用regexp来实现这一点,那么就不需要一些可笑的、毛茸茸的regexp
str.replace(/'(.*?)'/g, function(_, match) { return esc(match); })
如何编写esc
?大多数库都有这样的功能。或者,正如另一个答案所建议的,您也可以编写自己的。下面是一个解决方案,它使用浏览器的内置功能来处理这些问题:
function esc(str) {
var e = document.createElement('div');
e.textContent = str;
return e.innerHTML;
}
这将为您提供:
>> var x = '<span class="k">function</span> () { <span class="k">this</span>.test = \'<p><span>test</span></p>\'; }'
>> x.replace(/'(.*?)'/g, function(_, match) { return esc(match); })
<< "<span class="k">function</span> () { <span class="k">this</span>.test = <p><span>test</span></p>; }"
>var x='function(){this.test=\'test\';}
>>x.replace(/'(.*?)/g,函数(u,match){返回esc(match);})
。请改用HTML解析器,就像您使用的浏览器为JavaScript提供的解析器一样。通常,您应该(HTML没有常规语法)。您是否考虑过使用HTML解析器。问题是,我不确定这是否会解析为HTML,因为它在带引号的字符串中有标记,这将使HTML解析器失效。太好了!谢谢您的回答。欢迎您。我也添加了示例代码。但您能解释一下您的示例代码吗?:)我现在已经添加了解释。这似乎是不必要的复杂和有限。
function esc(str) {
var e = document.createElement('div');
e.textContent = str;
return e.innerHTML;
}
>> var x = '<span class="k">function</span> () { <span class="k">this</span>.test = \'<p><span>test</span></p>\'; }'
>> x.replace(/'(.*?)'/g, function(_, match) { return esc(match); })
<< "<span class="k">function</span> () { <span class="k">this</span>.test = <p><span>test</span></p>; }"