我正在使用正则表达式将纯文本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的结尾视为URL的结尾标记?这在我的正则表达式中是如何体现的呢?
7条答案
按热度按时间5fjcxozz1#
一个semicolon is reserved和应该只用于其特殊用途(这取决于方案)。
第2.2节:
许多URL方案保留某些字符用于特殊含义:它们在URL的方案特定部分中的出现具有指定的语义。如果在方案中保留了对应于八位字节的字符,则必须对该八位字节进行编码。字符“
;
“、“/
“、“?
“、“:
“、“@
“、“=
“和“&
“是在方案中可能保留用于特殊含义的字符。在方案中不能保留其他字符。1tuwyuhd2#
W3C鼓励CGI程序在查询字符串中接受
;
和&
(即以相同的方式处理?name=fred&age=50
和?name=fred;age=50
)。这应该是因为
&
必须在HTML中编码为&
,而;
不需要。myss37ts3#
分号是一个法律的URI字符;它属于次级类别:http://www.ietf.org/rfc/rfc3986.txt
然而,规范指出,分号对于 specific URI是否合法取决于该URI的方案或生产者。因此,如果使用这些链接的网站不允许分号,那么它们在特定情况下无效。
dhxwm5r44#
从技术上讲,域名是URL字符串中的法律的子域名;上面引用了大量的源材料,包括http://www.ietf.org/rfc/rfc3986.txt。
有些人确实将其用于合法目的,尽管它的使用可能是特定于站点的(即,仅用于该站点),因为它的使用必须由使用它的站点定义。
然而,在真实的世界中,URL中的伪随机数的主要用途是将病毒或钓鱼URL隐藏在合法URL后面。
例如,向某人发送带有此链接的电子邮件:
http://www.yahoo.com/junk/nonsense; 0200.0xfe.0x37.0xbf/malicious_file/
将导致Yahoo!链接(www.yahoo.com/junk/nonsense)被忽略,因为即使它是合法的(即,正确形成)没有这样的页面存在。但是第二个链接(0200.0xfe.0x37.0xbf/malicious_file/)可能存在 *,用户将被定向到malicious_file页面;因此,一个人的公司IT经理将得到一份报告,一个人可能会得到一份解雇通知书。
在所有反对者发火之前,这正是新的Facebook网络钓鱼问题的工作原理。像往常一样,名字被改变以保护罪犯。
kyvafyod5#
是的,URL中的后缀有效。然而,如果你是从相对非结构化的散文中摘取它们,那么假设URL的 * 末尾 * 的标点符号是句子标点符号可能是安全的。这同样适用于其他标点符号,如句号,问号,引号等。
如果您只对具有显式
http[s]
协议的URL感兴趣,并且您的正则表达式风格支持lookbehinds,那么这个正则表达式应该足够了:https?://[\w!#$%&'()*+,./:;=?@\[\]-]+(?<![!,.?;:"'()-])
在协议之后,它只是匹配URL中可能有效的一个或多个字符,而根本不用担心结构。但随后它会根据需要退回尽可能多的位置,直到最后一个字符不是可能是句子标点的东西。
pu3pd22g6#
http://www.ietf.org/rfc/rfc3986.txt涵盖了URL和可能以未编码形式出现的字符。如果URL中包含的URL可以在浏览器中正常工作,那么您的代码应该支持它们。
bqujaahr7#
引用RFC对回答这个问题并没有多大帮助,因为您会遇到带有逗号(以及逗号)的URL。我们有一个Regex不处理逗号和逗号,我们在NutshellMail的一些用户抱怨说,因为包含它们的URL实际上存在于野外。尝试在Facebook或Twitter中构建一个包含'的虚拟URL;'或',您将看到这两个服务正确地编码了完整的URL。
我用下面的模式替换了我们正在使用的正则表达式(并且已经测试过它的工作情况):
这个正则表达式来自http://rickyrosario.com/blog/converting-a-url-into-a-link-in-csharp-using-regular-expressions/(略有修改)