Validation 哪些字符使URL无效?

Validation 哪些字符使URL无效?,validation,url,rfc3986,Validation,Url,Rfc3986,哪些字符使URL无效 这些是有效的URL吗 example.com/file[/].html http://example.com/file[/].html 不是对你问题的真正回答,但验证url确实是一个严重的p.i.t.a 您最好验证域名,并将查询部分保留在url中。这是我的经验。 您也可以求助于ping url并查看它是否会产生有效的响应,但对于这样一个简单的任务来说,这可能太多了 检测url的正则表达式非常丰富,google it:)可以在URI中使用的所有有效字符(a是的一种类型)都在

哪些字符使URL无效

这些是有效的URL吗

  • example.com/file[/].html
  • http://example.com/file[/].html

不是对你问题的真正回答,但验证url确实是一个严重的p.i.t.a 您最好验证域名,并将查询部分保留在url中。这是我的经验。 您也可以求助于ping url并查看它是否会产生有效的响应,但对于这样一个简单的任务来说,这可能太多了

检测url的正则表达式非常丰富,google it:)

可以在URI中使用的所有有效字符(a是的一种类型)都在中定义

所有其他字符都可以在URL中使用,前提是它们首先是“URL编码”的。这涉及更改特定“代码”的无效字符(通常以百分比符号(%)后跟十六进制数的形式)


此链接包含无效字符的编码列表。

通常,由(请参阅)定义的URI可能包含以下84个字符中的任意一个:

ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~:/?#[]@!$&'()*+,;=
请注意,此列表没有说明这些字符可能出现在URI中的什么位置


任何其他字符都需要使用百分比编码(
%
hh
)进行编码。URI的每一部分都有关于百分比编码单词需要表示哪些字符的进一步限制。

在您的补充问题中,您询问了
www.example.com/file[/].html
是否为有效URL

该URL无效,因为URL是URI的一种类型,并且有效的URI必须具有类似于http:(请参阅)的方案

如果你想问如果
http://www.example.com/file[/].html
是一个有效的URL,那么答案仍然是否定的,因为方括号字符在那里无效

方括号字符保留用于以下格式的URL:
http://[2001:db8:85a3::8a2e:370:7334]/foo/bar
(即IPv6文本而不是主机名)


如果您想完全理解这个问题,那么值得仔细阅读RFC 3986。

要添加一些说明并直接解决上述问题,有几类字符会导致URL和URI出现问题

有些字符是不允许的,永远不应该出现在URL/URI中,有些字符是保留字符(如下所述),有些字符在某些情况下可能会导致问题,但被标记为“不明智”或“不安全”。(URL)和(URI)中明确说明了限制字符的原因。注:较新的规范(更新至RFC-1738)定义了给定上下文中允许的字符的构造,但较旧的规范提供了以下规则中不允许的字符的更简单和更一般的描述

排除URI语法中不允许的US-ASCII字符:

   control     = <US-ASCII coded characters 00-1F and 7F hexadecimal>
   space       = <US-ASCII coded character 20 hexadecimal>
   delims      = "<" | ">" | "#" | "%" | <">
查询组件中的字符和/或在URI/URL中具有特殊含义的字符:

  reserved    = ";" | "/" | "?" | ":" | "@" | "&" | "=" | "+" | "$" | ","
上面的“保留”语法类指的是URI中允许的字符,但在通用URI语法的特定组件中可能不允许的字符并非在所有上下文中都保留“保留”集中的字符。例如,主机名可以包含一个可选的用户名,因此可以是
ftp://user@主机名/
,其中“@”字符具有特殊含义

以下是一个URL示例,该URL包含无效和不明智的字符(例如“$”、“[”、“]”),应正确编码:

http://mw1.google.com/mw-earth-vectordb/kml-samples/gp/seattle/gigapxl/$[level]/r$[y]_c$[x].jpg

URI和URL的某些字符限制依赖于编程语言。例如,“|”(0x7C)字符,尽管仅标记为“不明智”在URI规范中,将在Java.net.URI构造函数中抛出一个URISyntaxException,因此类似于
http://api.google.com/q?exp=a|b
是不允许的,必须改为编码为
http://api.google.com/q?exp=a%7Cb
如果将Java与URI对象实例一起使用。

我需要选择字符来拆分字符串中的URL,所以我决定创建一个我自己在URL中找不到的字符列表:

>>> allowed = "-_.~!*'();:@&=+$,/?%#[]?@ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
>>> from string import printable
>>> ''.join(set(printable).difference(set(allowed)))
'`" <\x0b\n\r\x0c\\\t{^}|>'
>>allowed=“-.~!*”():@&=+$,/?%#[]?@abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzo123456789”
>>>从字符串导入可打印
>>>''.join(集合(可打印).difference(集合(允许)))
'`" '

因此,可能的选择是换行符、制表符、空格、反斜杠和
“{}^
。我想我会和《太空》或《新行》一起去。:)

一些Unicode字符范围是有效的HTML5,尽管使用它们可能仍然不是一个好主意

例如,
href
文档说:

和区域元素上的href属性的值必须是可能由空格包围的有效URL

然后,“有效URL”的定义指向,其目的是:

将RFC 3986和RFC 3987与当代实施保持一致,并在过程中淘汰它们

该文件定义如下:

ASCII字母数字“!”、“$”、“&”、“,”、“(”、”、“*”、“+”、“、”、“-”、“/”、“:”、“;”、“=”、“?”、“@“、“、”、“~”,以及范围为U+00A0到U+D7FF、U+E000到U+FDCF、U+FDF0到U+FFFD、U+10000到U+1FFD、U+20000到U+2FFD、U+30000到U+3FFF、U+40000到FFU+5FD到FFU+6FD、FFU+FFU+7FD到FFU+FFU+FFU+FFU+7FD、FFU+FFU+70000到FFU+6FD+FFU+FFU+FFU+FFU+FFU的代码点,U+80000至U+8FFFD,U+90000至U+9FFFD,U+A0000至U+AFFFFD,U+B0000至U+BFFFD,U+C0000至U+CFFFD,U+D0000至U+DFFFD,U+E1000至U+EFFFFD,U+F0000至U+FFFD,U+100000至U+10FFFD

然后在语句中使用术语“URL代码点”:

如果c不是URL代码点且不是“%”,则解析错误

在解析算法的几个部分中,包括模式、权限、相对路径、查询和片段状态:因此基本上是整个URL

此外,验证程序还会传递URL,如
”你好",不传递带有空格等字符的URL
>>> allowed = "-_.~!*'();:@&=+$,/?%#[]?@ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
>>> from string import printable
>>> ''.join(set(printable).difference(set(allowed)))
'`" <\x0b\n\r\x0c\\\t{^}|>'
  %xA0-D7FF / %xF900-FDCF / %xFDF0-FFEF
/ %x10000-1FFFD / %x20000-2FFFD / %x30000-3FFFD
/ %x40000-4FFFD / %x50000-5FFFD / %x60000-6FFFD
/ %x70000-7FFFD / %x80000-8FFFD / %x90000-9FFFD
/ %xA0000-AFFFD / %xB0000-BFFFD / %xC0000-CFFFD
/ %xD0000-DFFFD / %xE1000-EFFFD
\ { } < > | ` ^ "