在引号之间匹配HTML打开的标记

时间:2015-04-22 08:43:29

标签: javascript html regex

我有一个小的HTML代码:

<span class="k">function</span> () { <span class="k">this</span>.test = '<p><span>test</span></p>'; }

和这个正则表达式:

/["|'](<)|(<)(?:\/[^>]>)["|']/g

使用此正则表达式,它返回两个匹配的结果,但我想要的是匹配引号之间的所有html打开标记并将它们分组为一个结果。正确的正则表达式是什么? 我需要用&lt;替换那些打开的标签。 提前谢谢!

1 个答案:

答案 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 = &lt;p&gt;&lt;span&gt;test&lt;/span&gt;&lt;/p&gt;; }"