如何检测(使用正则表达式或启发式)文本字符串(如评论)中的网站链接?
目的是防止垃圾邮件。HTML 被剥离,所以我需要检测复制和粘贴的邀请。 垃圾邮件发送者发布链接应该不经济,因为大多数用户无法成功访问该页面。我想要关于最佳实践的建议、参考或讨论。
一些目标:
- 像格式良好的 URL 一样容易实现的目标 (
http://some-fqdn/some/valid/path.ext
) - URL 但没有
http://
前缀(即有效的 FQDN + 有效的 HTTP 路径) - 任何其他有趣的事情
当然,我正在阻止垃圾邮件,但是可以使用相同的过程来自动链接文本。
想法
这是我在想的一些事情。
- 内容是母语散文,所以我可以在检测中触发快乐
- 我应该先去掉所有空格来捕捉“
www .example.com
”吗?普通用户会知道自己删除空间,还是让任何浏览器“按我的意思做”并为您剥离它? - 也许多次传球是一个更好的策略,扫描:
- 格式正确的 URL
- 所有非空格后跟“。” 后跟任何有效的 TLD
- 还要别的吗?
相关问题
我已经阅读了这些内容,它们现在记录在此处,因此您可以根据需要在这些问题中引用正则表达式。
更新和总结
哇,我在这里列出了一些非常好的启发式方法!对我来说,最划算的是以下几点的综合:
- @Jon Bright 的 TLD 检测技术(一个很好的防御瓶颈)
- 对于那些可疑的字符串,按照@capar 将点替换为点状字符
- @Sharkey 的下标 · 是一个不错的点状字符。(即“ · ”)。· 也是一个单词边界,因此很难随意复制和粘贴。
这应该使垃圾邮件发送者的每千次展示费用足够低以满足我的需求;“标记为不适当”的用户反馈应该可以捕捉到其他任何东西。列出的其他解决方案也非常有用:
- 去掉所有虚线四边形(@Sharkey 对他自己的回答的评论)
- @Sporkmonger 对客户端 Javascript 的要求,它将所需的隐藏字段插入到表单中。
- ping URL 服务器端以确定它是否是一个网站。(也许我可以通过 SpamAssassin 或其他贝叶斯过滤器按照@Nathan 运行 HTML ..)
- 查看 Chrome 智能地址栏的来源,看看 Google 使用了哪些巧妙的技巧
- 调用 OWASP AntiSAMY 或其他 Web 服务进行垃圾邮件/恶意软件检测。