2009-07-24 483 views
27

我正在使用正则表达式将纯文本URL转换为可单击的链接。URL可以包含分号吗?

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

但是,有时在文中的主体中,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末尾的标记?这怎么符合我的正则表达式?

回答

35

A semicolon is reserved并且除特殊用途(取决于方案)外,不得使用未编码。 2.2节:

许多URL方案保留一定的 字符有特殊含义: 它们在URL的 具体方案的部分外观有 指定的语义。如果在一个方案中保留对应于八位组的字符 为 ,则八位位组必须编码为 。字符“;”, “/”,“?”,“:”,“@”,“=”和“&”为 字符,其可以是在 方案中保留用于特殊含义的字符。在方案中保留其他字符不可以是 。

+19

“不得使用未编码”:...用于除特殊含义以外的目的。该问题的正确答案是“是的,在URL中使用分号是合法的”,但是我从这个答案中得到的印象(不是规格报价,而是总结)是“不,未编码的分号可能不是在URL中使用“。 – Miles 2009-07-24 14:53:42

+0

@Miles编辑澄清 – Greg 2009-07-24 14:57:05

+0

我迟到了,但此代码明确处理http/https网址,允许;作为查询字符串分隔符(而不是&)......实际上,Ben已经覆盖了这一点。 – Powerlord 2010-02-22 20:30:47

11

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

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

23

W3C鼓励CGI程序接受;以及查询字符串中的&(即,以相同方式对待?name=fred&age=50?name=fred;age=50)。这应该是因为&必须编码为& amp;在HTML中,而;没有。

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/来(有轻微的修改)

4

是的,分号在URL中有效。但是,如果您从相对非结构化的散文中摘取它们,则可能安全地认为URL的处的分号意味着作为句子标点符号。对于其他句子标点符号也是如此,例如句点,问号,引号等。

如果您只对具有明确的http[s]协议的URL感兴趣,并且您的正则表达式支持lookbehinds,则该正则表达式应该足够了:

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

协议之后,它简单地匹配一个或多个字符可以是在URL有效,无需担心结构在所有。但是,它会根据需要退出尽可能多的位置,直到最后的字符不是可能是句子标点符号。

6

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

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

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

例如,某人发送一封电子邮件,此链接:

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

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

并且在所有的可否代言人得到他们的皮头之前,这正是Facebook新的网络钓鱼问题的作用方式。名称已经改变,像往常一样保护有罪。

*据我所知,实际上没有这样的页面。显示的链接仅用于本讨论。

相关问题