Regex URL是否可以包含分号且仍然有效?

Regex URL是否可以包含分号且仍然有效?,regex,url,syntax,uri,Regex,Url,Syntax,Uri,我使用正则表达式将纯文本URL转换为可单击链接 @(https?:/([-\w\.]+)+(:\d+)(/([\w/\u\.-]*(\?\ S+))@ 但是,有时在文本正文中,URL每行枚举一个,末尾带有分号。真正的URL不包含任何“;” 允许在URL中使用分号(;),还是可以将分号视为URL结尾的标记?这在我的正则表达式中如何适用?介绍了URL以及哪些字符可能以未编码的形式出现。考虑到包含分号的URL在浏览器中正常工作,您的代码应该支持分号。A并且应该仅用于其特殊用途(这取决于方案) 第2.2

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

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

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

允许在URL中使用分号(;),还是可以将分号视为URL结尾的标记?这在我的正则表达式中如何适用?

介绍了URL以及哪些字符可能以未编码的形式出现。考虑到包含分号的URL在浏览器中正常工作,您的代码应该支持分号。

A并且应该仅用于其特殊用途(这取决于方案)

第2.2节:

许多URL方案保留了某些 具有特殊含义的字符: 他们出现在 URL中特定于方案的部分具有 指定语义。如果角色 对应于八位组的是 在方案中保留,八位字节必须 被编码。字符“;”, “/”、“?”、“:”、“@”、“=”和“&”是 可能是 在特定的时间内保留特殊含义 计划。不能使用其他字符 在方案中保留


分号是合法的URI字符;它属于子分隔符类别:


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

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

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

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


string regex=@”((www.|(http | https | ftp | news | file)+\:\/)[_;.a-zA-Z0-9-]+\.[a-zA-Z0-9\/_;:@=.+?,##%&&~-]*[^.| \'''.\124;|\(|?|,| |>|是的,分号在URL中是有效的。但是,如果你是从相对非结构化的散文中提取分号,则可以安全地假设URL末尾的分号是句子标点符号。句点、问号、引号等其他句子标点符号也是如此

如果您只对带有显式
http[s]
协议的URL感兴趣,并且您的正则表达式风格支持lookbehinds,那么这个正则表达式应该足够:


https?://[\w!#$%&'()*+,./:;=?@\[\]-]+(?从技术上讲,分号是URL字符串中的合法子分隔符;上面引用了大量源材料,包括

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

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

例如,使用此链接向某人发送电子邮件:

http://www.yahoo.com/junk/junk;0200.0xfe.0x37.0xbf/malative_文件/

将导致忽略Yahoo!链接(www.Yahoo.com/junk/胡说八道),因为即使它是合法的(即格式正确的)也不存在这样的页面。但是第二个链接(0200.0xfe.0x37.0xbf/malistic_file/)可能存在*并且用户将被引导到恶意的_文件页面;因此,公司IT经理将收到一份报告,并且可能会收到一份解雇通知单

在所有反对者都愤怒起来之前,这正是新的Facebook网络钓鱼问题的工作原理。名称已经改变,以一如既往地保护罪犯


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

我添加了代码格式,以便我们可以更轻松地阅读,但我不建议使用该正则表达式。撇开明显的web混乱和许多冗余的反斜杠和管道不谈,最后的两个字符类存在严重缺陷。否它们不仅排除了分号和括号等有效字符,而且最后一个字符与引号、大括号和非ASCII字符等各种无效字符相匹配。我来晚了,但这段代码明确处理http/https URL,它允许;作为查询字符串分隔符(而不是&)…实际上,本已经谈到了这一点。W3C的鼓励似乎主要在这里…哪个应用程序打开
0200.0xfe.0x37.0xbf
,因为它知道yahoo链接将返回404状态?!对我来说没有意义。
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
 string regex = @"((www\.|(http|https|ftp|news|file)+\:\/\/)[&#95;.a-zA-Z0-9-]+\.[a-zA-Z0-9\/&#95;:@=.+?,##%&~_-]*[^.|\'|\# |!|\(|?|,| |>|<|;|\)])";