</</script>标记中的</作为javascript正则表达式的一部分,以<

时间:2019-06-23 17:04:15

标签: javascript regex escaping

我在<script>标记中有一些带有内联javascript的HTML代码,其中包含一个正则表达式,如{p>中所示,该字符删除了><字符之间的多余空格。

<script>
[...]
output = output.replace(/>\s*</g, '><');
[...]
</script> 

这是无效的HTML(例如,根据PHP DOMDocument->loadHTML()),因为它是字符序列</ ends processing,并且期望其后跟结束标记{{1 }}。

我曾尝试将script>转换为<,但随后该表达式不再匹配(在jsfiddle中进行了测试)。

一种解决方法是在正则表达式中插入实际上不会做任何事情,只是将&lt;<分开的内容,例如

/

这可以正常工作并且具有预期的行为,但是看起来却很糟糕。

在js正则表达式中在output = output.replace(/>\s*[<]/g, '><'); 之前转义<的正确方法是什么?

1 个答案:

答案 0 :(得分:1)

如果PHP的DOMDocument->loadHTML()认为脚本元素到此结束,那么我可以肯定这是DOMDocument->loadHTML()中的错误。脚本元素以</script>结尾,并且script元素的内容不是 HTML。 script elements的内容模型比规范中需要多段说明的模型要有趣得多。

关于</的问题,规范only mentions处理<!--</script>,而不是一般的</

但是,如果您必须具有内联脚本(如果代码位于.js文件中,则不会有此问题),并且必须将其加载有明显有错误的内容,字符类([<]而不是<)一点也不差。 (我怀疑性能是否是您关心的问题,但如果是这样,我想我们可以肯定地说JavaScript引擎的正则表达式处理程序将能够优化该单个字符字符类。)