有关使用Regex进行URL验证的问题

Question about URL Validation with Regex

我有以下regex可以很好地匹配URL:

1
((https?|ftp|gopher|telnet|file|notes|ms-help):((//)|(\\\\))+[\w\d:#@%/;$()~_?\+-=\\\.&]*)`

但是,它不处理没有前缀的URL,即StasOffFuff.com或www. Google网站不匹配。有人知道我如何修改这个regex,不关心是否有前缀吗?

编辑:我的问题太模糊了吗?需要更多细节吗?

1
(((https?|ftp|gopher|telnet|file|notes|ms-help):((//)|(\\\\)))?[\w\d:#@%/;$()~_?\+-=\\\.&]*)

我加了一个()?类似vinko-vrsalovic所建议的协议,但是现在regex几乎可以匹配任何字符串,只要它有有效的url字符。

我的实现是我有一个数据库来管理内容,它有一个字段,可以是纯文本、电话号码、URL或电子邮件地址。我在寻找一种简单的方法来验证输入,这样我就可以对其进行正确的格式化,即为URL/电子邮件创建定位标记,并格式化电话号码,如何在整个站点中格式化其他号码。有什么建议吗?


如果您阅读了URL规范的第5节(http://www.isi.edu/in-notes/rfc1738.txt),您将看到URL的语法至少为:

1
scheme ':' schemepart

其中scheme为1个或多个字符,schemepart为0个或多个字符。因此,如果没有冒号,就没有URL。

也就是说,/users/不在乎他们是否给了你一个URL,对他们来说,它看起来像一个。所以我要做的是:

在验证之前,如果其中没有冒号,请在http://前面加上冒号,然后通过所需的任何验证程序运行它。这会将任何合法的主机名(毕竟可能不包括域信息)转换为类似于URL的内容。

1
frob  ->  http://frob

(几乎)主机部分的唯一规则是,如果不包含点,则不能以数字开头。现在,对于特定的方案,应该执行特定的验证,到目前为止,所有给定的正则表达式都没有完成。但是,规范遵从性可能不是您想要"验证"的。因此,主机名部分的DNS查询可能很有用,但除非您在与用户相同的上下文中使用相同的解析器,否则它不会在所有情况下都起作用。


下面的正则表达式正则表达式是从掌握的优秀图书。如果你不熟悉的间距/评论免费模式,你会得到一suggest熟悉它。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
\b
# Match the leading part (proto://hostname, or just hostname)
(
    # ftp://, http://, or https:// leading part
    (ftp|https?)://[-\w]+(\.\w[-\w]*)+
  |
    # or, try to find a hostname with our more specific sub-expression
    (?i: [a-z0-9] (?:[-a-z0-9]*[a-z0-9])? \. )+ # sub domains
    # Now ending .com, etc. For these, require lowercase
    (?-i: com\b
        | edu\b
        | biz\b
        | gov\b
        | in(?:t|fo)\b # .int or .info
        | mil\b
        | net\b
        | org\b
        | name\b
        | coop\b
        | aero\b
        | museum\b
        | [a-z][a-z]\b # two-letter country codes
    )
)

# Allow an optional port number
( : \d+ )?

# The rest of the URL is optional, and begins with / . . .
(
     /
     # The rest are heuristics for what seems to work well
     [^.!,?;"'<>()\[\]{}\s\x7F-\xFF]*
     (?:
        [.!,?]+  [^.!,?;"'<>()\[\]{}\s\x7F-\xFF]+
     )*
)?

对正则表达式的解释(这是完全解释briefly一书有一个或更多的)网址的结尾点分隔件与端位或有限的列表,或两个字母的国家代码(.uk .fr……)。此外,配件可能有任何的人物或alphanumeric hyphens’是不可能的,但hyphens第一或最后的字符的部分。那么,有可能是端口号,然后它的其余部分。

提取从去这个网站,http:///listing.cgi regex.info吗?ED = 3 &;P = 207,它是从207页的第3版。

"版权页所说的吗?Jeffrey Friedl的2008年"我我不知道什么是在使用的条件是,如果你希望我会是你可以使用它自己的书……我希望我不会把它打破的规则在这里。


你可以在根围的前缀部分和匹配的事件需要一个0或1

(((https?|ftp|gopher|telnet|file|notes|ms-help):((//)|(\\\\))+)?

操作系统将成为整个正则表达式

(((https?|ftp|gopher|telnet|file|notes|ms-help):((//)|(\\\\))+)?[\w\d:#@%/;$()~_?\+-=\\\.&]*)

这样的问题是它的或多或少要匹配任何字。例如,"测试"还将被匹配。

你在哪里,要使用正则表达式?你想确认你在试图找到的主机名或主机名在段落?


你的正则表达式匹配与所有这些协议的一个开始,很多的事情,包括可能存在的URL是不能放松,如果你在协议部分(可选与制作它?)然后你就可以匹配几乎一切,包括空字符串。

在其他的话,它是否匹配的URL,因为它的大的就业选配与几乎任何启动http://,https://,ftp://等在线。好的,但是它也FTP:◎和MS:/帮助,但让我们忽略那个。

它可能使感,因为这取决于目前使用的其他方法,正则表达式域白名单很快成为了维护的非有效部分可选的协议,但制作不使意识。

一个实例(与宽松的协议的现场部分):

1
2
3
4
5
6
>>> r = re.compile('(((https?|ftp|gopher|telnet|file|notes|ms-help):((//)|(\\\\))+)?[\w\d:#@%/;$()~_?\+-=\\\.&]*)')
>>> r.search('oompaloompa_is_not_an_ur%&%%l').groups()[0]
'oompaloompa_is_not_an_ur%&%%l' #Matches!
>>> r.search('oompaloompa_isdfjakojfsdi.sdnioknfsdjknfsdjk.fsdnjkfnsdjknfsdjk').groups()[0]
'oompaloompa_isdfjakojfsdi.sdnioknfsdjknfsdjk.fsdnjkfnsdjknfsdjk' #Matches!
>>>

你给了我你的编辑suggest或者让用户选择他,在什么是枚举,添加一列,或创建一个正则表达式的检查是simpler IL此外至少一点,也许一些普通人物的有效域。

第三,这将是非常缓慢的交替使用,只有当URL是真的真的真的重要的是验证的访问请求的URL和在它的头,如果你得到一个错误的主机或没有发现,你知道这是不合法的。你可以试试看邮件时,如果存在蛛网膜下腔出血的MX主机开放端口25。如果两个故障时,它将普通文本。(这是指我不提示)


制用:

1
.*

即所有的比赛。

你想的东西是不匹配的主机名的URL(生产技术),.

没有,你可以到definitively确定结构使用的主机名。也许你可以看端在".com"的事情,然后你会错过任何co.uk,网络域名,。。。。。。。等。。。。。。。

编辑:

在其他的话:如果你需要删除的URL。这样的协议启动,你会不会有任何东西到比赛在线。这取决于你使用正则表达式在线:是

  • 把一切这些URL
  • 保持适当的协议的要求
  • 在主机架的检查是普通结局(如.com .net .org)和接受你会错过一些。