主要观点:主要讨论了在 JavaScript 中去除 XML 注释的问题,指出常见的用正则表达式去除 XML 注释的方法存在性能问题和漏洞,介绍了多种解决办法,包括使用不同的正则表达式引擎、利用外在约束、不使用正则表达式而用标准字符串操作、验证数据以及限制在可信数据范围内等。
关键信息:
- 常见的去除 XML 注释的正则表达式
/<!--[\s\S]*?-->/
存在性能问题,如在处理大量重复<!--
的字符串时,运行时间呈二次方增长。 - 多个开源项目使用了该有问题的正则表达式,如 Nunjucks、PrettierJS 等。
- 不同编程语言的相关库在处理正则表达式时性能表现不同,如 NodeJS 的
re2
引擎性能线性增长,Rust 的regex
crate 性能也线性增长。 - 可以利用 XML 规范等外在约束来优化正则表达式,避免回溯,提高性能。
- 还可以不使用正则表达式,通过标准字符串操作来去除 XML 注释,或者在使用正则表达式的地方进行数据验证等。
重要细节:
- 正则表达式的工作原理,如
/<!--[\s\S]*?-->/
中各部分的含义,以及贪婪匹配和非贪婪匹配的区别。 - 不同环境下(如 NodeJS 和 Rust)使用不同正则表达式库的示例和性能测试结果。
- 一些资源对该问题的相关讨论和推荐,如书籍、StackOverflow 答案等。
- 特殊感谢 Asadbek、Jardel 和 SheetJS 团队的早期反馈。
- 相关标准如 XML 1.0 和 HTML5 对注释的规定,以及在不同环境中的应用。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。