使用发现的STRING_ESCAPE函数here我用字符串值转义了某些列,以便它们适合JSON格式。但是,在我看来,将其应用于URL时,其行为会很奇怪。
SELECT STRING_ESCAPE('https://www.website.com/page', 'json')
返回https:\/\/www.website.com\/page
。
我可以理解,实际上,根据this post,正斜杠是允许的,而JSON则不需要,因此在使用此功能时会将其包括在内。但是,如果您使用此值(https:\/\/www.website.com\/page
创建HTML标记,则该链接将不再起作用,至少在我的浏览器中,该链接正试图浏览到https://www.website.com//page
。
由于我不知道我的原始字符串是否包含\/
,所以我不能仅仅使用REPLACE(STRING_ESCAPE([column], 'json'), '\/', '/')
来解决这个问题。
是否有一个选项可以禁止转义正斜杠?或其他解决此问题的聪明方法?
答案 0 :(得分:0)
我不知道有任何选项可以禁用转义正斜杠,但是如果您正在寻找解决方法的想法,则可以用一些虚拟值替换正斜杠,然后进行转义,然后通过以下方式恢复正斜杠:用正斜杠替换虚拟值。
这样的想法:
DECLARE @replace_value VARCHAR(36) = NEWID();
SELECT
STRING_ESCAPE('https://www.website.com/page', 'json'),
REPLACE(STRING_ESCAPE(REPLACE('https://www.website.com/page', '/', @replace_value), 'json'), @replace_value, '/');
不是最漂亮的,但是可以完成工作。
答案 1 :(得分:0)
序言:最初的问题是试图将 JSON 转义的值 不 稍后作为 JSON 使用,因为 URL 不是 JSON 字符串。但是,此答案并未关注在 HTML 中使用之前不正确的域使用和/或未能解码 JSON 值。
相反,这个答案纠正了这种误解:
<块引用>因为我不知道我的原始字符串是否包含 [\/
],所以我不能只使用替换来解决这个问题。
只要使用了 STRING_ESCAPE,使用 STRING_ESCAPE 后执行替换是一种有效的方法,如原始问题所示:
REPLACE(STRING_ESCAPE([column], 'json'), '\/', '/')
这是因为 STRING_ESCAPE 对每个 /
和 \
进行转义,这意味着原始源中的任何 \/
也 被转义如\\\/
。 (只有 \
没有被转义,才会有问题。)
考虑这些示例,这些示例会生成没有转义立体线的有效 JSON 字符串内容,它们证明了简单 REPLACE 方法的正确性。
INPUT STRING_ESCAPE REPLACE(.., '\/', '/')
hello\world hello\\world hello\\world
hello/world hello\/world hello/world
hello\/workd hello\\\/world hello\\/world
\\/\/\\ \\\\\/\\\/\\\\ \\\\/\\/\\\\
以上值代表实际的字符串内容。