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
操作系统将成为整个正则表达式
这样的问题是它的或多或少要匹配任何字。例如,"测试"还将被匹配。
你在哪里,要使用正则表达式?你想确认你在试图找到的主机名或主机名在段落?
你的正则表达式匹配与所有这些协议的一个开始,很多的事情,包括可能存在的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。这样的协议启动,你会不会有任何东西到比赛在线。这取决于你使用正则表达式在线:是