如何检测(使用正则表达式或启发式方法)一个文本字符串中的网站链接,例如注释?
目的是防止垃圾邮件.HTML被剥离,所以我需要检测复制和粘贴的邀请. 垃圾邮件发送者发布链接应该不经济,因为大多数用户无法成功访问该页面.我想要有关最佳实践的建议,参考或讨论.
一些目标:
结构良好的URL(http://some-fqdn/some/valid/path.ext
)
URL但没有http://
前缀(即有效的FQDN +有效的HTTP路径)
任何其他有趣的业务
当然,我阻止垃圾邮件,但可以使用相同的过程来自动链接文本.
以下是我在想的一些事情.
内容是母语散文,所以我可以在检测中触发快乐
我应该首先删除所有空格,以便抓住" www .example.com
"吗?普通用户是否知道自己删除空间,或者做任何浏览器"做什么意思"并为你剥离它?
也许多次通过是更好的策略,扫描:
格式良好的网址
所有非空格后跟'.' 随后是任何有效的TLD
还要别的吗?
我已经阅读了这些内容,现在它们已在此处记录,因此您可以根据需要参考这些问题中的正则表达式.
用HTML链接javascript替换URL
检查字符串是否为有效URL的最佳正则表达式是什么
获取URL的一部分(正则表达式)
哇,我在这里列出了一些非常好的启发式方法!对我来说,最好的砰砰声是以下综合:
@Jon Bright检测TLD的技术(一个很好的防御性阻塞点)
对于那些可疑的字符串,请根据@capar将点替换为带点的字符
一个好看的字符是@ Sharkey的下标· (即" · ").· 也是一个单词边界,因此随便复制和粘贴更难.
这应该使垃圾邮件发送者的CPM足够低,以满足我的需求; "旗帜不合适"的用户反馈应该抓住其他任何东西.列出的其他解决方案也非常有用:
剥去所有虚线四边形(@ Sharkey对自己答案的评论)
@ Sporkmonger对客户端Javascript的要求,它在表单中插入了一个必需的隐藏字段.
对URL服务器端进行Ping操作以确定它是否是网站.(也许我可以按照@Nathan通过SpamAssassin或其他贝叶斯过滤器运行HTML ..)
查看Chrome的智能地址栏来源,了解Google使用的巧妙技巧
呼叫OWASP AntiSAMY或其他Web服务以进行垃圾邮件/恶意软件检测.
Jon Bright.. 19
我正在集中力量避免垃圾邮件发送者.这导致两个子假设:因此使用该系统的人将主动尝试违反您的检查,并且您的目标只是检测URL的存在,而不是提取完整的URL.如果您的目标是其他目标,这个解决方案会有所不同.
我认为你最好的选择是TLD.有两个字母的ccTLD和(目前)比较小的其他名单.这些需要以点为前缀,并以斜杠或某些单词边界为后缀.正如其他人所指出的那样,这并不完美.没有办法获得"buyfunkypharmaceuticals.它",而不会放弃合法的"我再试一次.它不起作用"或类似的东西.所有这些都说,这将是我的建议:
[^\b]\.([a-zA-Z]{2}|aero|asia|biz|cat|com|coop|edu|gov|info|int|jobs|mil|mobi|museum|name|net|org|pro|tel|travel)[\b/]
这将得到的东西:
buyfunkypharmaceutical s.it
googl e.com
http:// stackoverflo**w.com/**questions/700163 /
一旦人们开始混淆他们的URL,替换".",它当然会中断.用"点".但是,再次假设垃圾邮件发送者是你的目标,如果他们开始做这样的事情,他们的点击率将下降几个数量级的零.一组人告知足以对网址进行反混淆处理,而且我认为,无法通知足够访问垃圾网站的人群是一个微不足道的交叉点.此解决方案应该允许您检测可复制并粘贴到地址栏的所有URL,同时将附带损害保持在最低限度.
我正在集中力量避免垃圾邮件发送者.这导致两个子假设:因此使用该系统的人将主动尝试违反您的检查,并且您的目标只是检测URL的存在,而不是提取完整的URL.如果您的目标是其他目标,这个解决方案会有所不同.
我认为你最好的选择是TLD.有两个字母的ccTLD和(目前)比较小的其他名单.这些需要以点为前缀,并以斜杠或某些单词边界为后缀.正如其他人所指出的那样,这并不完美.没有办法获得"buyfunkypharmaceuticals.它",而不会放弃合法的"我再试一次.它不起作用"或类似的东西.所有这些都说,这将是我的建议:
[^\b]\.([a-zA-Z]{2}|aero|asia|biz|cat|com|coop|edu|gov|info|int|jobs|mil|mobi|museum|name|net|org|pro|tel|travel)[\b/]
这将得到的东西:
buyfunkypharmaceutical s.it
googl e.com
http:// stackoverflo**w.com/**questions/700163 /
一旦人们开始混淆他们的URL,替换".",它当然会中断.用"点".但是,再次假设垃圾邮件发送者是你的目标,如果他们开始做这样的事情,他们的点击率将下降几个数量级的零.一组人告知足以对网址进行反混淆处理,而且我认为,无法通知足够访问垃圾网站的人群是一个微不足道的交叉点.此解决方案应该允许您检测可复制并粘贴到地址栏的所有URL,同时将附带损害保持在最低限度.
查看这些文章:
网址问题
检测文本块中的URL
我不确定检测带有正则表达式的URL是否是解决此问题的正确方法.通常你会错过某种晦涩难懂的边缘案例,如果垃圾邮件发送者有足够的动力,他们就可以利用它.
如果您的目标只是过滤掉评论中的垃圾邮件,那么您可能需要考虑贝叶斯过滤.事实证明,将电子邮件标记为垃圾邮件非常准确,它可能也能为您做同样的事情,具体取决于您需要过滤的文本量.
我知道这对自动链接文本没有帮助,但如果你搜索并用一个看起来像是同一个东西的字符替换所有的句号,比如希伯来点hiriq(U + 05B4)的unicode字符怎么办?
以下段落是一个例子:
这可能会起作用ִ期间看起来有点奇怪,但它仍然可读ִ当然的好处是任何复制和粘贴wwwִgoogleִcom的人都不会太ִ:)