我正在向 SendGrid 模板添加自定义链接。
链接的一部分是一些 URL 查询参数。它们由与号 (&) 分隔,如下所示:
<a href="www.example.com?arg1=foo&arg2=bar">My Link</a>
Sendgrid 不断自动更新上面的字符串,转义字符并创建以下内容:
<a href="www.example.com?arg1=foo&arg2=bar">My Link</a>
这根本不是相同的链接,我希望它不要在我的自定义 html 代码中强制字符转义。
不,这两个链接不一样
const t1 = new URLSearchParams("a=1&b=2");
console.log(t1.get("a")); // 1
console.log(t1.get("b")); // null
console.log(t1.get("amp;b")); // 2
const t2 = new URLSearchParams("a=1&b=2");
console.log(t2.get("a")); // 1
console.log(t2.get("b")); // 2
我怎样才能让 SendGrid 允许我使用 & 符号?
答案1
这是正常的,不会改变 URL 的含义,因为它会在&
解析 HTML 文档时自动解码回。
通常,在 HTML 和 XHTML 中,单个 & 符号必须写为“字符实体引用”,以避免与实际 HTML 实体引用(例如“<”或“"”)混淆。所有解析器都会识别命名引用,&
尽管诸如这样的变体&
也是合法的。
作者应使用“&”(ASCII 十进制 38)代替“&”,以避免与字符引用的开头(实体引用开放分隔符)混淆。作者还应在属性值中使用“&”,因为 CDATA 属性值中允许使用字符引用。
属性值是文本和字符引用的混合,但有一个额外的限制,即文本不能包含歧义的“与”符号。[...]
8.2.4.72. 字符引用状态
如果无法找到匹配项,且临时缓冲区由 U+0026 AMPERSAND 字符 (&) 后跟一个或多个字母数字 ASCII 字符序列以及 U+003B 分号字符 (;) 组成,则会出现解析错误。[...] 如果匹配的最后一个字符不是 U+003B 分号字符 (;),则会出现解析错误。
为了确保文档与历史 HTML 用户代理和基于 XML 的用户代理兼容,文档中使用的要被视为文字字符的 & 符号必须本身表示为实体引用(例如“
&
”)。例如,当 a 元素的 href 属性引用带参数的 CGI 脚本时,必须将其表示为http://my.site.dom/cgi-bin/myscript.pl?class=guest&name=user
而不是http://my.site.dom/cgi-bin/myscript.pl?class=guest&name=user
。