如何(使用正则表达式或启发式)检测文本字符串(例如评论)中的网站链接?
目的是防止垃圾邮件。 HTML 被删除,因此我需要检测复制和粘贴的邀请。 垃圾邮件发送者发布链接应该不经济,因为大多数用户无法成功访问该页面。我想要有关最佳实践的建议、引用或讨论。
一些目标:
- 容易实现的目标,例如格式良好的网址 (
http://some-fqdn/some/valid/path.ext
) - 不带
http://
前缀的网址(即有效的 FQDN + 有效的 HTTP 路径) - 任何其他有趣的事情
当然,我会阻止垃圾邮件,但可以使用相同的过程来自动链接文本。
想法
以下是我的一些想法。
- 内容是母语散文,因此我可以轻松地进行检测
- 我应该先去掉所有空格以捕获“
www .example.com
”吗?普通用户是否知道自己删除空格,或者是否有浏览器“按照我的意思操作”并为您删除空格? - 也许多次扫描是更好的策略,扫描:
- 格式正确的网址
- 所有非空白字符后跟“.”后跟任何有效的 TLD
- 还有什么吗?
相关问题
我已经阅读了这些内容,并且现在将它们记录在此处,因此您可以根据需要引用这些问题中的正则表达式。
- replace URL with HTML Links javascript
- What is the best regular expression to check if a string is a valid URL
- Getting parts of a URL (Regex)
更新和摘要
哇,我这里列出了一些非常好的启发法!对我来说,最好的性价比是以下各项的综合:
- @Jon Bright 的 TLD 检测技术(良好的防御瓶颈)
- 对于那些可疑的字符串,请按照 @capar 将点替换为类似点的字符
- 一个好的点状角色是@Sharkey 的下标· (即“·”)。 ·也是一个单词边界,所以很难随意复制和粘贴。
这应该使垃圾邮件发送者的 CPM 足够低以满足我的需求; “标记为不适当”的用户反馈应该捕获其他任何内容。列出的其他解决方案也非常有用:
- 删除所有点四边形(@Sharkey 对他自己的答案的评论)
- @Sporkmonger 对客户端 Javascript 的要求,它将在表单中插入所需的隐藏字段。
- Ping URL 服务器端以确定它是否是一个网站。 (也许我可以按照 @Nathan 通过 SpamAssassin 或另一个贝叶斯过滤器运行 HTML。)
- 查看 Chrome 智能地址栏的源代码,了解 Google 使用了哪些巧妙技巧
- 调用 OWASP AntiSAMY 或其他网络服务进行垃圾邮件/恶意软件检测。
最佳答案
我的回答主要集中在避免垃圾邮件发送者上。这导致了两个子假设:使用该系统的人将因此积极尝试违反您的检查,而您的目标只是检测 URL 的存在,而不是提取完整的 URL。如果您的目标是其他目标,则该解决方案看起来会有所不同。
我认为您最好的选择是使用 TLD。有两个字母的 ccTLD 和(目前)相对较小的其他列表。它们需要以点为前缀,并以斜杠或某个单词边界作为后缀。正如其他人所指出的,这并不完美。如果不禁止合法的“我再试一次。它不起作用”或类似的内容,就没有办法获得“buyfunkypharmaceuticals.it”。综上所述,这是我的建议:
[^\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/]
这将得到的东西:
- buyfunkypharmaceuticals.it
- google.com
- http://stackoverflo **w.com/**questions/700163/
一旦人们开始混淆他们的 URL,替换“.”,它当然就会崩溃。与“点”。但是,再次假设垃圾邮件发送者是您的目标,如果他们开始做此类事情,他们的点击率将再下降几个数量级,接近零。我认为,有足够信息来对 URL 进行反混淆的一组人与一组没有足够信息来访问垃圾邮件网站的人之间存在微小的交集。该解决方案应该可以让您检测所有可复制并粘贴到地址栏的 URL,同时将附带损害降至最低。
关于language-agnostic - 检测文本字符串中的(顽皮或友善的)URL 或链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/700163/