我使用正则表达式将纯文本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末尾的标记?怎么会适合我的正则表达式?
答案 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)+\:\/\/)[_.a-zA-Z0-9-]+\.[a-zA-Z0-9\/_:@=.+?,##%&~_-]*[^.|\'|\# |!|\(|?|,| |>|<|;|\)])";
此正则表达式来自http://rickyrosario.com/blog/converting-a-url-into-a-link-in-csharp-using-regular-expressions/(稍作修改)