求JavaScript代码:转义非HTML/SSML标签内的<、>、&字符
解决方案:转义非HTML/SSML标签的特殊字符
要实现识别并转义字符串中不属于HTML/SSML标签的<、>、&,可以通过正则表达式的负向预查/后查来区分标签内的符号与独立符号,以下是具体实现代码:
function escapeUnsafeChars(str) { // 转义独立的&:排除已有的HTML实体(如 、{) str = str.replace(/&(?!#?[0-9a-zA-Z]+;)/g, '&'); // 转义不属于标签的<:排除完整的HTML/SSML标签开头(如<div>、<prosody rate="slow">) str = str.replace(/<(?!([a-zA-Z][a-zA-Z0-9:-]*)(\s+[a-zA-Z_:][a-zA-Z0-9_:-]*(\s*=\s*(["'].*?["']|[^>\s]+))?)*\s*>)/g, '<'); // 转义不属于标签的>:排除完整的HTML/SSML标签结尾 str = str.replace(/(?<!<([a-zA-Z][a-zA-Z0-9:-]*)(\s+[a-zA-Z_:][a-zA-Z0-9_:-]*(\s*=\s*(["'].*?["']|[^>\s]+))?)*\s*)>/g, '>'); return str; } // 测试用例 const input = 'This is a <b>bold</b> & <i>italic</i> text. While this < is a non closing bracket like this <3.'; const output = escapeUnsafeChars(input); console.log(output); // 输出结果: // 'This is a <b>bold</b> & <i>italic</i> text. While this < is a non closing bracket like this <3.'
代码说明
- 处理
&:通过负向预查(?!#?[0-9a-zA-Z]+;)确保只转义未构成HTML实体的独立&,避免破坏已有的实体符号。 - 处理
<:负向预查排除完整的标签开头结构——匹配<后是否跟随合法标签名、可选属性及闭合>,仅转义不符合该结构的独立<(如<3、<)。 - 处理
>:负向后查排除完整的标签结尾结构,仅转义不属于标签闭合部分的独立>。
该方案能覆盖大部分边缘场景,包括带属性的标签、SSML的特殊标签(如带冒号的<speak:xxx>)、以及与其他字符组合的特殊符号(如<3)。
内容的提问来源于stack exchange,提问作者Ayush Kumar
相关产品推荐
相关产品推荐

