我有一个小的HTML代码:
<span class="k">function</span> () { <span class="k">this</span>.test = '<p><span>test</span></p>'; }
和这个正则表达式:
/["|'](<)|(<)(?:\/[^>]>)["|']/g
使用此正则表达式,它返回两个匹配的结果,但我想要的是匹配引号之间的所有html打开标记并将它们分组为一个结果。正确的正则表达式是什么?
我需要用<
替换那些打开的标签。
提前谢谢!
答案 0 :(得分:2)
你已经打破了#34; HTML,在带引号的字符串中包含HTML标记。正如一些评论者所建议的那样,这将无法用HTML解析器解析字符串 - 原则上它们是正确的,但在这种情况下它不会起作用。
这个HTML片段来自哪里?您最好的选择是在工作流程的某个早期阶段转义引号中的HTML,这样您就不必编写丑陋的正则表达式来尝试解开它。
如果你真的想使用正则表达式来实现这一点,那就不需要一些荒谬的毛茸茸的正则表达式了。它应该足够了:
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>; }"