哪些字符使网址无效?
这些有效的网址是?
example.com/file[/].html
http://example.com/file[/].html
#1楼
为了添加一些说明并直接解决上面的问题,有几类字符会导致URL和URI出现问题。
有些字符是不允许的,不应出现在URL / URI,保留字符(如下所述)中,以及在某些情况下可能导致问题的其他字符,但标记为“不明智”或“不安全”。 RFC-1738 (URL)和RFC-2396 (URI)中明确说明了字符受限制的原因。 请注意,较新的RFC-3986 (对RFC-1738的更新)定义了给定上下文中允许使用哪些字符的构造,但较旧的规范提供了对以下规则不允许哪些字符的更简单和更一般的描述。
URI语法中不允许排除的US-ASCII字符:
control =
space =
delims = "" | "#" | "%" |
排除字符“#”,因为它用于从片段标识符分隔URI。 百分比字符“%”被排除,因为它用于转义字符的编码。 换句话说,“#”和“%”是必须在特定上下文中使用的保留字符。
允许列出不明智的字符,但可能会导致问题:
unwise = "{" | "}" | "|" | "\" | "^" | "[" | "]" | "`"
在查询组件中保留的字符和/或在URI / URL中具有特殊含义:
reserved = ";" | "/" | "?" | ":" | "@" | "&" | "=" | "+" | "$" | ","
上面的“保留”语法类指的是URI中允许的那些字符,但在通用URI语法的特定组件中可能不允许这些字符。 “保留”集中的字符不会在所有上下文中保留 。 例如,主机名可以包含可选的用户名,因此它可能类似于ftp://user@hostname/ ,其中'@'字符具有特殊含义。
以下是包含无效和不明智字符的网址示例(例如'$','[',']'),并且应正确编码:
http://mw1.google.com/mw-earth-vectordb/kml-samples/gp/seattle/gigapxl/$[level]/r$[y]_c$[x].jpg
URI / URL的一些字符限制是依赖于编程语言的。 例如,'|' (0x7C)字符虽然在URI规范中仅标记为“不明智”,但会在Java java.net.URI构造函数中抛出URISyntaxException ,因此像http://api.google.com/q?exp=a|b这样的URL是不允许,如果将Java与URI对象实例一起使用,则必须将其编码为http://api.google.com/q?exp=a%7Cb 。
#2楼
不是你的问题的答案,但验证网址确实是一个严重的皮塔饼你可能只是更好地验证域名并留下网址的查询部分。 这是我的经历。 您也可以使用ping网址并查看它是否会产生有效的响应,但这对于这么简单的任务来说可能太多了。
检测网址的正则表达式很丰富,google it :)
#3楼
可以在URI中使用的所有有效字符( URL是一种URI )在RFC 3986中定义。
所有其他字符都可以在URL中使用,前提是它们首先是“URL编码”。 这涉及更改特定“代码”的无效字符(通常以百分号(%)后跟十六进制数字的形式)。
此链接HTML URL编码参考包含无效字符的编码列表。
#4楼
通常, RFC 3986定义的URI(请参阅第2节:字符 )可以包含以下任何字符:
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~:/?#[]@!$&'()*+,;=
请注意,此列表未说明URI中可能出现这些字符的位置。
任何其他字符都需要使用百分比编码( % hh )进行编码。 URI的每个部分对于需要由百分比编码的单词表示的字符有进一步的限制。
#5楼
在您的补充问题中,您询问www.example.com/file[/].html是否为有效的网址。
该URL无效,因为URL是一种URI,有效的URI必须具有http:参见RFC 3986 )。
如果您打算询问http://www.example.com/file[/].html是否是有效的网址,则答案仍然是否定的,因为方括号字符在那里无效。
方括号字符是为以下格式的URL保留的: http://[2001:db8:85a3::8a2e:370:7334]/foo/bar (即IPv6文字而不是主机名)
如果你想完全理解这个问题,那么值得仔细阅读RFC 3986。