我正在使用 url 打开一个 html 页面,并且我正在使用页面 url 在查询字符串中发送数据。
例如:abc.html?firstParameter=firstvalue&seconedParameter=seconedvalue
问题是如果firstvalue
or secondvalue
in 参数包含特殊字符#,(,),%,{
,那么我的 url 构造不好。在这种情况下 url 没有验证。我正在做这一切javascript
。任何人都可以帮我解决这个问题。
我正在使用 url 打开一个 html 页面,并且我正在使用页面 url 在查询字符串中发送数据。
例如:abc.html?firstParameter=firstvalue&seconedParameter=seconedvalue
问题是如果firstvalue
or secondvalue
in 参数包含特殊字符#,(,),%,{
,那么我的 url 构造不好。在这种情况下 url 没有验证。我正在做这一切javascript
。任何人都可以帮我解决这个问题。
您有 3 个选项:
escape() will not encode: @*/+
encodeURI() will not encode: ~!@#$&*()=:/,;?+'
encodeURIComponent() will not encode: ~!*()'
但是在您的情况下,如果您想将 url 传递给其他页面的 GET 参数,您应该使用 escape 或 encodeURIComponent,而不是 encodeURI。
为了安全起见并确保您已经转义了 RFC 1738 和 RFC 3986 中指定的所有保留字符,您应该使用 encodeURIComponent、转义和替换星号('*')的组合,如下所示:
encoded = encodeURIComponent( parm ).replace(/[!'()]/g, escape).replace(/\*/g, "%2A");
[说明] 虽然 RFC 1738: Uniform Resource Locators (URL) 指定 *、!、'、( 和 ) 字符可以在 URL 中未编码,
因此,只有字母数字、特殊字符“$-_.+!*'()”和用于其保留目的的保留字符可以在 URL 中未编码地使用。
RFC 3986,第 12-13 页,声明这些特殊字符被保留为子分隔符。
保留= gen-delims / sub-delims
gen-delims = ":" / "/" / "?" /“#”/“[”/“]”/“@”
子分隔符=“!” /“$”/“&”/“'”/“(”/“)”/“*”/“+”/“”/“;” /“=”
escape() 函数已被弃用,但可用于对感叹号、单引号、左括号和右括号进行 URL 编码。而且由于星号是否必须在 URL 中编码存在一些歧义,并且编码也没有什么坏处,因此您可以使用诸如 replace() 函数调用之类的方法显式编码。[请注意,escape() 函数作为第二个参数传递给第一个 replace() 函数调用。如此处使用的,replace 为每个匹配的特殊字符 !、'、( 或 ) 调用一次 escape() 函数,并且 escape 仅返回该字符的“转义序列”以进行替换,这会将任何转义字符与另一个字符重新组合碎片。]
另请参阅“https://stackoverflow.com/questions/6533561/urlencode-the-asterisk-star-character”
此外,虽然一些网站甚至将星号(*)标识为 RFC3986 下的保留字符,但它们并未将其包含在其 URL 组件编码工具中。
未编码的 URL 参数:
parm1=this is a test of encoding !@#$%^&*()'
parm2=note that * is not encoded
编码的 URL 参数:
parm1=this+is+a+test+of+encoding+%21%40%23%24%25%5E%26*%28%29%27
parm2=note+that+*+is+not+encodeds+not+encoded