Vin*_*ent 36 regex url syntax uri
我使用正则表达式将纯文本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
Run Code Online (Sandbox Code Playgroud)
是否允许在URL中使用分号(;)或分号是否可以作为URL结尾的标记?这怎么会适合我的正则表达式?
小智 27
W3C鼓励CGI计划接受; 以及&在查询字符串中(即对待?name=fred&age=50
和?name=fred;age=50
相同的方式).这应该是因为&必须编码为& 在HTML中; 没有.
小智 12
分号是合法的URI字符; 它属于sub-delimiter类别:http://www.ietf.org/rfc/rfc3986.txt
但是,规范声明半色是否对特定 URI 合法取决于该URI的方案或生产者.因此,如果使用这些链接的站点不允许使用分号,那么它们对于该特定情况无效.
是的,分号在 URL 中有效。但是,如果您从相对非结构化的散文中提取它们,则可以安全地假设 URL末尾的分号表示句子标点符号。这同样适用于其他句子标点字符,如句号、问号、引号等。
如果您只对具有显式协议的 URL 感兴趣http[s]
,并且您的正则表达式风格支持lookbehinds,则此正则表达式应该足够了:
https?://[\w!#$%&'()*+,./:;=?@\[\]-]+(?<![!,.?;:"'()-])
在协议之后,它只是匹配 URL 中可能有效的一个或多个字符,根本不用担心结构。但随后它会根据需要后退尽可能多的位置,直到最后的字符不是句子标点符号。
小智 5
从技术上讲,分号是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 /)可能存在*并且用户将被定向到malicious_file页面; 一个人的公司IT经理将得到一份报告,一个人可能会得到一个粉红色的单据.
在此之前所有的说话者都说得好,这正是新的Facebook网络钓鱼问题的解决方法.这些名字已经改变,像往常一样保护有罪.
*根据我的知识,实际上并没有这样的页面.显示的链接仅用于本讨论.