URL可以包含分号吗?

时间:2009-07-24 14:22:16

标签: regex url

我使用正则表达式将纯文本URL转换为可点击链接。

@(https?://([-\w\.]+)+(:\d+)?(/([\w/_\.-]*(\?\S+)?)?)?)@

但是,有时在文本正文中,每行都会枚举一个URL,并在末尾添加一个分号。真实的URL不包含任何“;”。

http://www.aaa.org/pressdetail.asp?PRESS_REL_ID=275;
http://www.aaa.org/pressdetail.asp?PRESS_REL_ID=123;
http://www.aaa.org/pressdetail.asp?PRESS_REL_ID=124

是否允许在URL中使用分号(;)或分号是否可以作为URL末尾的标记?怎么会适合我的正则表达式?

7 个答案:

答案 0 :(得分:39)

A semicolon is reserved,除非其特殊目的(取决于方案),否则不得使用未编码。 第2.2节:

  

许多网址方案保留了一定的价值   具有特殊含义的字符:   他们的出现在   URL的方案特定部分有一个   指定的语义。如果是角色   对应于八位字节是   在一个计划中保留,八位字节必须   被编码。那些角色 ”;”,   “/”,“?”,“:”,“@”,“=”和“&”是   可能是的人物   保留在a。中的特殊含义   方案。没有其他人物可能   在计划中保留。

答案 1 :(得分:26)

W3C鼓励CGI计划接受;以及&在查询字符串中(即以同样的方式处理?name=fred&age=50?name=fred;age=50)。这应该是因为&必须编码为& amp;在HTML中;没有。

答案 2 :(得分:11)

分号是合法的URI字符;它属于子分隔符类别:http://www.ietf.org/rfc/rfc3986.txt

但是,规范声明半色是否对于特定的 URI是合法的取决于该URI的方案或生产者。因此,如果使用这些链接的网站不允许使用分号,那么它们对该特定情况无效。

答案 3 :(得分:5)

http://www.ietf.org/rfc/rfc3986.txt涵盖了网址以及以未编码形式显示的字符。鉴于包含分号的URL在浏览器中正常工作,您的代码应该支持它们。

答案 4 :(得分:5)

从技术上讲,分号是URL字符串中的合法子分隔符;上面引用了大量的素材,包括http://www.ietf.org/rfc/rfc3986.txt

有些人确实将它用于合法目的,尽管它的使用可能是特定于站点的(即仅用于该站点),因为它的使用必须由使用它的站点定义。

但在现实世界中,URL中分号的主要用途是隐藏合法网址后面的病毒或网上诱骗网址。

例如,向某人发送包含此链接的电子邮件:

http:// www.yahoo.com/junk/nonsense;0200.0xfe.0x37.0xbf/malicious_file /

将导致雅虎!链接(www.yahoo.com/junk/nonsense)被忽略,因为即使它是合法的(即,正确形成),也不存在这样的页面。但是第二个链接(0200.0xfe.0x37.0xbf / malicious_file /)可能存在*并且用户将被定向到malicious_file页面;一个人的公司IT经理将获得一份报告,一个人可能会得到一个粉红色的单据。

在所有那些说话者说出他们的危险之前,这正是新的Facebook网络钓鱼问题的运作方式。这些名字已经改变,以照常保护有罪。

*据我所知,这个页面确实存在。显示的链接仅用于本讨论。

答案 5 :(得分:4)

是的,分号在网址中有效。但是,如果你从相对非结构化的散文中挑选它们,那么假设URL的 end 处的分号是句子标点符号可能是安全的。其他句子标点符号也是如此,如句号,问号,引号等。

如果您只对具有明确http[s]协议的网址感兴趣,并且您的正则表达式支持lookbehinds,那么此正则表达式就足够了:

https?://[\w!#$%&'()*+,./:;=?@\[\]-]+(?<![!,.?;:"'()-])

在协议之后,它只是匹配一个可能在URL中有效的一个或多个字符,而根本不用担心结构。但是它会在必要时支持尽可能多的职位,直到最后一个角色不是可能是句子标点符号。

答案 6 :(得分:1)

引用RFC对回答此问题并不是很有帮助,因为您将遇到带分号的URL(以及逗号)。我们有一个没有处理分号和逗号的正则表达式,我们在NutshellMail的一些用户抱怨,因为包含它们的URL确实存在于野外。尝试在Facebook或Twitter中构建包含“;”的虚拟URL或','您将看到这两个服务正确编码完整的URL。

我用以下模式替换了我们正在使用的正则表达式(并测试了它的工作原理):

 string regex = @"((www\.|(http|https|ftp|news|file)+\:\/\/)[&#95;.a-zA-Z0-9-]+\.[a-zA-Z0-9\/&#95;:@=.+?,##%&~_-]*[^.|\'|\# |!|\(|?|,| |>|<|;|\)])";

此正则表达式来自http://rickyrosario.com/blog/converting-a-url-into-a-link-in-csharp-using-regular-expressions/(稍作修改)