Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/370.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在引号之间匹配HTML打开标记_Javascript_Html_Regex - Fatal编程技术网

Javascript 在引号之间匹配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

我有下面的小html代码:

<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, '&gt;');
代码段(您将看到
符号):

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