我也很感兴趣是否有针对即将推出的产品发布的规范中文,阿拉伯语网址(显然会对我的问题产生很大的影响)
#1 楼
编辑:正如@Jukka K. Korpela正确指出的那样,RFC 1738已由RFC 3986更新。这已扩展并阐明了对主机有效的字符,很遗憾,它不容易复制和粘贴,但我会尽力而为。
以第一个匹配的顺序:
host = IP-literal / IPv4address / reg-name
IP-literal = "[" ( IPv6address / IPvFuture ) "]"
IPvFuture = "v" 1*HEXDIG "." 1*( unreserved / sub-delims / ":" )
IPv6address = 6( h16 ":" ) ls32
/ "::" 5( h16 ":" ) ls32
/ [ h16 ] "::" 4( h16 ":" ) ls32
/ [ *1( h16 ":" ) h16 ] "::" 3( h16 ":" ) ls32
/ [ *2( h16 ":" ) h16 ] "::" 2( h16 ":" ) ls32
/ [ *3( h16 ":" ) h16 ] "::" h16 ":" ls32
/ [ *4( h16 ":" ) h16 ] "::" ls32
/ [ *5( h16 ":" ) h16 ] "::" h16
/ [ *6( h16 ":" ) h16 ] "::"
ls32 = ( h16 ":" h16 ) / IPv4address
; least-significant 32 bits of address
h16 = 1*4HEXDIG
; 16 bits of address represented in hexadecimal
IPv4address = dec-octet "." dec-octet "." dec-octet "." dec-octet
dec-octet = DIGIT ; 0-9
/ %x31-39 DIGIT ; 10-99
/ "1" 2DIGIT ; 100-199
/ "2" %x30-34 DIGIT ; 200-249
/ "25" %x30-35 ; 250-255
reg-name = *( unreserved / pct-encoded / sub-delims )
unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~" <---This seems like a practical shortcut, most closely resembling original answer
reserved = gen-delims / sub-delims
gen-delims = ":" / "/" / "?" / "#" / "[" / "]" / "@"
sub-delims = "!" / "$" / "&" / "'" / "(" / ")"
/ "*" / "+" / "," / ";" / "="
pct-encoded = "%" HEXDIG HEXDIG
来自RFC 1738规范的原始答案:
因此,只能在URL中使用未编码的字母数字,特殊字符“
$-_.+!*'(),
”和用于保留目的的保留字符。
^自1998年以来已过时。
评论
@Tim斜杠是保留字符,因此,如果将其用于保留目的(描述路径,协议描述...),则不需要转义。否则,它会。
–迈尔斯
2012年7月6日在22:26
RFC 1738的通用语法规则在1998年被废弃。
– Jukka K. Korpela
13年8月8日在7:17
@ Myles,STD 66(= RFC 3986)在其他答案中被提及。答案的内容是否正确是另一个问题。我认为任何答案都不能正确描述完整列表。
– Jukka K. Korpela
13年8月8日在15:05
并且您可以在此答案的开头添加未保留的A-Za-z0-9 _.-〜和保留字符的列表。 !*'();:@&= + $,/?#[]可以为人们节省时间
– Mikl
16年5月30日在16:20
@basZero对不起,您发现它令人困惑,但是完整的答案并不简单。您的问题的答案是否定的,因为它是保留字符,如下所示:reserved = gen-delims / sub-delims gen-delims =“:” /“ /” /“?” /“#” /“ [” /“]” /“ @”
–迈尔斯
16年8月31日在22:13
#2 楼
URI中允许的字符是保留的还是不保留的(或作为百分比编码一部分的百分比字符)
http://en.wikipedia.org/ Wiki / Percent-encoding#Types_of_URI_characters
表示,如果需要保留特殊含义,它们是RFC 3986未保留字符(第2.3节)以及保留字符(第2.2节)。还将百分比字符作为百分比编码的一部分。
评论
尽管此链接可以回答问题,但最好在此处包括答案的基本部分,并提供链接以供参考。如果链接的页面发生更改,仅链接的答案可能会失效。
–j.a.estevan
2014年5月15日18:40
链接文档中的@ j.a.estevan引用:URI中允许的字符是保留的还是不保留的(或作为百分号编码的一部分的百分号)
– Mikl
16年5月30日在16:05
#3 楼
66个未保留字符的完整列表在RFC3986中,在这里:http://tools.ietf.org/html/rfc3986#section-2.3这是以下正则表达式集中的任何字符:
[A-Za-z0-9_.\-~]
评论
您也可以使用保留的那些。
– Qwerty
13年3月21日在11:53
过期的RFC1738列出了{} ^ \〜并反引号表示不安全。由于文件系统,RFC3986列出\为不安全。这意味着{} ^也可以使用。
– mgutt
17-2-16在15:22
因此,如果您要尝试在字符串中找到URL的结尾(即我),则最好采用公认的答案中的过时标准...如果要验证URL,则应在此答案上使用字符集。
–ashleedawg
18年7月14日在10:17
小心,您已将其编写为正则表达式字符类。确保转义-或将其放在字符类的开头或结尾,因为[.-〜]实际上包含从46到126的所有ASCII字符。
–kwl
19年1月24日在7:25
#4 楼
我通过请求我的网站(apache)进行了测试,并将德语键盘上所有可用的字符作为URL参数:http://example.com/?^1234567890ß´qwertzuiopü+asdfghjklöä#<yxcvbnm,.-°!"§$%&/()=? `QWERTZUIOPÜ*ASDFGHJKLÖÄ\'>YXCVBNM;:_²³{[]}\|µ@€~
这些未编码:
^0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ,.-!/()=?`*;:_{}[]\|~
urlencode()
之后未编码:0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ.-_
rawurlencode()
之后未编码:0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ.-_~
注意:在PHP 5.3.0之前,由于RFC 1738,
rawurlencode()
编码为~
。但是现在已由RFC 3986取代,因此现在可以安全使用。但是我不明白为什么{}
是通过rawurlencode()
编码的,因为在RFC 3986中未提及它们。我进行的另一项测试是有关邮件文本中的自动链接的。我测试了Mozilla Thunderbird,aol.com,outlook.com,gmail.com,gmx.de和yahoo.de,它们完全链接了包含以下字符的URL:
0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ.-_~+#,%&=*;:@
当然,
?
也被链接了,但只有使用一次即可。现在有人建议只使用
rawurlencode()
字符,但是您是否听说有人在打开这些网站时遇到问题?星号http://wayback.archive.org/web/*/http://google.com
冒号https://en.wikipedia.org/wiki/维基百科:关于
加号https://plus.google.com/+google
标志处的冒号,逗号和感叹号https://www.google.com/maps /place/USA/@36.2218457,...
因为这些字符应该未经编码就可以使用而不会出现问题。当然,由于编码序列如
&;
,您不应该使用&
。相同的原因对于%
也是有效的,因为它通常用于编码char。和=
一样,它为参数名称分配了一个值。最后,我想说可以使用这些未编码的代码:0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ.-_~!+,*:@
但是如果您期望使用随机生成的URL,而不应该使用
.!
,因为这些URL标记了句子的结尾,并且某些邮件应用程序不会自动链接该URL的最后一个字符。示例:Visit http://example.com/foo=bar! !
评论
实用的方法-做得好。正在寻找您的最后一个列表-特别是+号:-D
–奥利弗
19年3月22日在15:59
#5 楼
从这里因此,只有字母数字,特殊字符
$-_.+!*'(),
和用于其
保留目的的保留字符可以在URL中未经编码地使用。 >
#6 楼
RFC3986定义了可以在URI中使用的两组字符:保留的字符:
:/?#[]@!$&'()*+,;=
reserved = gen-delims / sub-delims
gen-delims =“:” /“ /” /“?” /“#” /“ [” /“]” /“ @”
sub-delims =“!” /“ $” /“&” /“'” /“(” /“)” /“ *” /“ +” /“,” /“;” /“ =”
保留字符的目的是提供一组分隔字符,这些字符可与URI中的其他数据区分开。在保留字符替换为其相应的百分比编码八位字节方面不同的URI不等效。
未保留的字符:
A-Za-z0-9-_.~
未保留= ALPHA / DIGIT /“-” /“。 /“ _” /“〜”
URI中允许但没有保留用途的字符称为未保留。
#7 楼
这些在RFC3986中列出。请参阅Collected ABNF for URI,以了解在何处允许使用什么以及用于解析/验证的正则表达式。#8 楼
即将发生的变化是针对中文,阿拉伯域名而不是URI。国际化的URI称为IRI,并且在RFC 3987中进行了定义。不过,我还是建议您不要自己做,而要依赖现有的经过测试的库,因为URI编码/解码有很多选择,哪些被认为是安全的。根据规格,而不是实际使用的安全性(浏览器)。#9 楼
如果您想给用户一种特殊的体验,可以使用pushState
在浏览器的网址中添加各种字符:var u="";var tt=168;
for(var i=0; i< 250;i++){
var x = i+250*tt;
console.log(x);
var c = String.fromCharCode(x);
u+=c;
}
history.pushState({},"",250*tt+u);
评论
URI中允许的字符是保留的!*'();:@&= + $,/?#[]或未保留的A-Za-z0-9_。〜-(或百分比字符%作为百分比的一部分) -encoding)在MySQL中,我使用REGEXP'[^] A-Za-z0-9_。〜!*''();:@&= + $,/?#[%-] +'查找带有错误字符的URL字符串。也许对其他人也有用。
@Mikl:那东西看起来几乎不像正则表达式。