相关疑难解决方法(0)

检测文本字符串中的(顽皮或漂亮)URL或链接

如何检测(使用正则表达式或启发式方法)一个文本字符串中的网站链接,例如注释?

目的是防止垃圾邮件.HTML被剥离,所以我需要检测复制和粘贴的邀请. 垃圾邮件发送者发布链接应该不经济,因为大多数用户无法成功访问该页面.我想要有关最佳实践的建议,参考或讨论.

一些目标:

  • 结构良好的URL(http://some-fqdn/some/valid/path.ext)
  • URL但没有http://前缀(即有效的FQDN +有效的HTTP路径)
  • 任何其他有趣的业务

当然,我阻止垃圾邮件,但可以使用相同的过程来自动链接文本.

思路

以下是我在想的一些事情.

  • 内容是母语散文,所以我可以在检测中触发快乐
  • 我应该首先删除所有空格,以便抓住" www .example.com"吗?普通用户是否知道自己删除空间,或者做任何浏览器"做什么意思"并为你剥离它?
  • 也许多次通过是更好的策略,扫描:
    • 格式良好的网址
    • 所有非空格后跟'.' 随后是任何有效的TLD
    • 还要别的吗?

相关问题

我已经阅读了这些内容,现在它们已在此处记录,因此您可以根据需要参考这些问题中的正则表达式.

更新和摘要

哇,我在这里列出了一些非常好的启发式方法!对我来说,最好的砰砰声是以下综合:

  1. @Jon Bright检测TLD的技术(一个很好的防御性阻塞点)
  2. 对于那些可疑的字符串,请根据@capar将点替换为带点的字符
  3. 一个好看的字符是@ Sharkey的下标· (即" · ").· 也是一个单词边界,因此随便复制和粘贴更难.

这应该使垃圾邮件发送者的CPM足够低,以满足我的需求; "旗帜不合适"的用户反馈应该抓住其他任何东西.列出的其他解决方案也非常有用:

  • 剥去所有虚线四边形(@ Sharkey对自己答案的评论)
  • @ Sporkmonger对客户端Javascript的要求,它在表单中插入了一个必需的隐藏字段.
  • 对URL服务器端进行Ping操作以确定它是否是网站.(也许我可以按照@Nathan通过SpamAssassin或其他贝叶斯过滤器运行HTML ..)
  • 查看Chrome的智能地址栏来源,了解Google使用的巧妙技巧
  • 呼叫OWASP AntiSAMY或其他Web服务以进行垃圾邮件/恶意软件检测.

language-agnostic url sanitization spam-prevention

37
推荐指数
4
解决办法
7010
查看次数

检查给定的字符串是否为URL

在我的rails应用程序中,我需要验证用户提供的URL是否真的是一个URL.我只关心HTTP协议(也许是HTTPS,我根本没有考虑过这一点),这让我相信在rails中可能已经存在一些可以为我工作的东西.

如果不是:你能推荐一个正则表达式字符串吗?我在google搜索后发现了一些,但根据用户评论他们似乎都有一两个问题.

谢谢

ruby regex ruby-on-rails

33
推荐指数
1
解决办法
2万
查看次数

如何删除Python中字符串中的任何URL

我想删除字符串中的所有URL(用""替换它们)我搜索过但却找不到我想要的东西.

例:

text1
text2
http://url.com/bla1/blah1/
text3
text4
http://url.com/bla2/blah2/
text5
text6
http://url.com/bla3/blah3/
Run Code Online (Sandbox Code Playgroud)

我希望结果如下:

text1
text2
text3
text4
text5
text6
Run Code Online (Sandbox Code Playgroud)

python regex url replace python-2.7

31
推荐指数
11
解决办法
7万
查看次数

如何检测字符串中URL的存在

我有一个输入字符串说Please go to http://stackoverflow.com.检测到String的url部分,并且<a href=""></a>许多浏览器/ IDE /应用程序自动添加锚点.所以它变成了Please go to <a href='http://stackoverflow.com'>http://stackoverflow.com</a>.

我需要使用Java做同样的事情.

java url

28
推荐指数
3
解决办法
5万
查看次数

url的正则表达式

可能重复:
检查字符串是否为有效URL的最佳正则表达式是什么?

没有网址的正则表达式是什么http://www.?当用户输入uri名称时,我想验证它是否是uri

regex dns url

28
推荐指数
0
解决办法
8万
查看次数

Ruby正则表达式匹配url

可能重复:正则
表达式匹配URL
正则表达式删除ruby中网址的网页部分

我正在寻找一个正则表达式来解析文件中的所有url.
我尝试了谷歌搜索后获得的许多正则表达式,但在一个或另一个案例中失败了.我的想法是写一个在begening检查http或https的presense,它将匹配所有内容,直到它看到一个空格.
有任何想法吗 ?
注意:我不需要解析网址但删除文件中的所有网址或至少使其无法读取.

ruby regex url

23
推荐指数
2
解决办法
3万
查看次数

用于验证URL的Javascript正则表达式

我正在使用以下正则表达式验证URL.我也想验证google.com,但它返回false.可以在下面的RE中更改以验证google.com.

console.log(learnRegExp('http://www.google-com.123')); // false
console.log(learnRegExp('https://www.google-com.com')); // true
console.log(learnRegExp('http://google-com.com')); // true
console.log(learnRegExp('http://google.com')); //true
console.log(learnRegExp('google.com')); //false

function learnRegExp(){
  return /^(ftp|https?):\/\/+(www\.)?[a-z0-9\-\.]{3,}\.[a-z]{3}$/.test(learnRegExp.arguments[0]);
}
Run Code Online (Sandbox Code Playgroud)

html javascript regex validation

19
推荐指数
3
解决办法
6万
查看次数

什么是RFC兼容和工作正则表达式来检查字符串是否是有效的URL

有几乎相同的名称存在问题: 检查字符串是否为有效URL的最佳正则表达式是什么

我不明白这个stackoverflow.似乎我需要声誉来评论答案.由于我没有它,我不知道如何告诉/要求提议的解决方案似乎不起作用.所以我不得不提出一个新问题并以这种方式寻求解决方案?

更新:似乎Reg Exp支持IPV6,因为IPv6应该像http:// [2620:0:1cfe:face:b00c :: 3] /一样应该归咎于我.

因此,我现在唯一知道的问题是,它接受example.org:作为有效的URL.

或者是PHP的责任?

/**
  * Validate URL - RFC 3987 (IRI)
  *
  * https://stackoverflow.com/questions/161738/what-is-the-best-regular-expression-to-check-if-a-string-is-a-valid-url
  *
  * @param string $str_url
  * @return boolean
  */
 function is_url($str_url)
 {
  // RFC 3987 For absolute IRIs (internationalized):
  return (bool) preg_match('/^[a-z](?:[-a-z0-9\+\.])*:(?:\/\/(?:(?:%[0-9a-f][0-9a-f]|[-a-z0-9\._~\x{A0}-\x{D7FF}\x{F900}-\x{FDCF}\x{FDF0}-\x{FFEF}\x{10000}-\x{1FFFD}\x{20000}-\x{2FFFD}\x{30000}-\x{3FFFD}\x{40000}-\x{4FFFD}\x{50000}-\x{5FFFD}\x{60000}-\x{6FFFD}\x{70000}-\x{7FFFD}\x{80000}-\x{8FFFD}\x{90000}-\x{9FFFD}\x{A0000}-\x{AFFFD}\x{B0000}-\x{BFFFD}\x{C0000}-\x{CFFFD}\x{D0000}-\x{DFFFD}\x{E1000}-\x{EFFFD}!\$&\'\(\)\*\+,;=:])*@)?(?:\[(?:(?:(?:[0-9a-f]{1,4}:){6}(?:[0-9a-f]{1,4}:[0-9a-f]{1,4}|(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])(?:\.(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])){3})|::(?:[0-9a-f]{1,4}:){5}(?:[0-9a-f]{1,4}:[0-9a-f]{1,4}|(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])(?:\.(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])){3})|(?:[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){4}(?:[0-9a-f]{1,4}:[0-9a-f]{1,4}|(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])(?:\.(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])){3})|(?:[0-9a-f]{1,4}:[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){3}(?:[0-9a-f]{1,4}:[0-9a-f]{1,4}|(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])(?:\.(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])){3})|(?:(?:[0-9a-f]{1,4}:){0,2}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){2}(?:[0-9a-f]{1,4}:[0-9a-f]{1,4}|(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])(?:\.(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])){3})|(?:(?:[0-9a-f]{1,4}:){0,3}[0-9a-f]{1,4})?::[0-9a-f]{1,4}:(?:[0-9a-f]{1,4}:[0-9a-f]{1,4}|(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])(?:\.(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])){3})|(?:(?:[0-9a-f]{1,4}:){0,4}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:[0-9a-f]{1,4}|(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])(?:\.(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])){3})|(?:(?:[0-9a-f]{1,4}:){0,5}[0-9a-f]{1,4})?::[0-9a-f]{1,4}|(?:(?:[0-9a-f]{1,4}:){0,6}[0-9a-f]{1,4})?::)|v[0-9a-f]+[-a-z0-9\._~!\$&\'\(\)\*\+,;=:]+)\]|(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])(?:\.(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])){3}|(?:%[0-9a-f][0-9a-f]|[-a-z0-9\._~\x{A0}-\x{D7FF}\x{F900}-\x{FDCF}\x{FDF0}-\x{FFEF}\x{10000}-\x{1FFFD}\x{20000}-\x{2FFFD}\x{30000}-\x{3FFFD}\x{40000}-\x{4FFFD}\x{50000}-\x{5FFFD}\x{60000}-\x{6FFFD}\x{70000}-\x{7FFFD}\x{80000}-\x{8FFFD}\x{90000}-\x{9FFFD}\x{A0000}-\x{AFFFD}\x{B0000}-\x{BFFFD}\x{C0000}-\x{CFFFD}\x{D0000}-\x{DFFFD}\x{E1000}-\x{EFFFD}!\$&\'\(\)\*\+,;=@])*)(?::[0-9]*)?(?:\/(?:(?:%[0-9a-f][0-9a-f]|[-a-z0-9\._~\x{A0}-\x{D7FF}\x{F900}-\x{FDCF}\x{FDF0}-\x{FFEF}\x{10000}-\x{1FFFD}\x{20000}-\x{2FFFD}\x{30000}-\x{3FFFD}\x{40000}-\x{4FFFD}\x{50000}-\x{5FFFD}\x{60000}-\x{6FFFD}\x{70000}-\x{7FFFD}\x{80000}-\x{8FFFD}\x{90000}-\x{9FFFD}\x{A0000}-\x{AFFFD}\x{B0000}-\x{BFFFD}\x{C0000}-\x{CFFFD}\x{D0000}-\x{DFFFD}\x{E1000}-\x{EFFFD}!\$&\'\(\)\*\+,;=:@]))*)*|\/(?:(?:(?:(?:%[0-9a-f][0-9a-f]|[-a-z0-9\._~\x{A0}-\x{D7FF}\x{F900}-\x{FDCF}\x{FDF0}-\x{FFEF}\x{10000}-\x{1FFFD}\x{20000}-\x{2FFFD}\x{30000}-\x{3FFFD}\x{40000}-\x{4FFFD}\x{50000}-\x{5FFFD}\x{60000}-\x{6FFFD}\x{70000}-\x{7FFFD}\x{80000}-\x{8FFFD}\x{90000}-\x{9FFFD}\x{A0000}-\x{AFFFD}\x{B0000}-\x{BFFFD}\x{C0000}-\x{CFFFD}\x{D0000}-\x{DFFFD}\x{E1000}-\x{EFFFD}!\$&\'\(\)\*\+,;=:@]))+)(?:\/(?:(?:%[0-9a-f][0-9a-f]|[-a-z0-9\._~\x{A0}-\x{D7FF}\x{F900}-\x{FDCF}\x{FDF0}-\x{FFEF}\x{10000}-\x{1FFFD}\x{20000}-\x{2FFFD}\x{30000}-\x{3FFFD}\x{40000}-\x{4FFFD}\x{50000}-\x{5FFFD}\x{60000}-\x{6FFFD}\x{70000}-\x{7FFFD}\x{80000}-\x{8FFFD}\x{90000}-\x{9FFFD}\x{A0000}-\x{AFFFD}\x{B0000}-\x{BFFFD}\x{C0000}-\x{CFFFD}\x{D0000}-\x{DFFFD}\x{E1000}-\x{EFFFD}!\$&\'\(\)\*\+,;=:@]))*)*)?|(?:(?:(?:%[0-9a-f][0-9a-f]|[-a-z0-9\._~\x{A0}-\x{D7FF}\x{F900}-\x{FDCF}\x{FDF0}-\x{FFEF}\x{10000}-\x{1FFFD}\x{20000}-\x{2FFFD}\x{30000}-\x{3FFFD}\x{40000}-\x{4FFFD}\x{50000}-\x{5FFFD}\x{60000}-\x{6FFFD}\x{70000}-\x{7FFFD}\x{80000}-\x{8FFFD}\x{90000}-\x{9FFFD}\x{A0000}-\x{AFFFD}\x{B0000}-\x{BFFFD}\x{C0000}-\x{CFFFD}\x{D0000}-\x{DFFFD}\x{E1000}-\x{EFFFD}!\$&\'\(\)\*\+,;=:@]))+)(?:\/(?:(?:%[0-9a-f][0-9a-f]|[-a-z0-9\._~\x{A0}-\x{D7FF}\x{F900}-\x{FDCF}\x{FDF0}-\x{FFEF}\x{10000}-\x{1FFFD}\x{20000}-\x{2FFFD}\x{30000}-\x{3FFFD}\x{40000}-\x{4FFFD}\x{50000}-\x{5FFFD}\x{60000}-\x{6FFFD}\x{70000}-\x{7FFFD}\x{80000}-\x{8FFFD}\x{90000}-\x{9FFFD}\x{A0000}-\x{AFFFD}\x{B0000}-\x{BFFFD}\x{C0000}-\x{CFFFD}\x{D0000}-\x{DFFFD}\x{E1000}-\x{EFFFD}!\$&\'\(\)\*\+,;=:@]))*)*|(?!(?:%[0-9a-f][0-9a-f]|[-a-z0-9\._~\x{A0}-\x{D7FF}\x{F900}-\x{FDCF}\x{FDF0}-\x{FFEF}\x{10000}-\x{1FFFD}\x{20000}-\x{2FFFD}\x{30000}-\x{3FFFD}\x{40000}-\x{4FFFD}\x{50000}-\x{5FFFD}\x{60000}-\x{6FFFD}\x{70000}-\x{7FFFD}\x{80000}-\x{8FFFD}\x{90000}-\x{9FFFD}\x{A0000}-\x{AFFFD}\x{B0000}-\x{BFFFD}\x{C0000}-\x{CFFFD}\x{D0000}-\x{DFFFD}\x{E1000}-\x{EFFFD}!\$&\'\(\)\*\+,;=:@])))(?:\?(?:(?:%[0-9a-f][0-9a-f]|[-a-z0-9\._~\x{A0}-\x{D7FF}\x{F900}-\x{FDCF}\x{FDF0}-\x{FFEF}\x{10000}-\x{1FFFD}\x{20000}-\x{2FFFD}\x{30000}-\x{3FFFD}\x{40000}-\x{4FFFD}\x{50000}-\x{5FFFD}\x{60000}-\x{6FFFD}\x{70000}-\x{7FFFD}\x{80000}-\x{8FFFD}\x{90000}-\x{9FFFD}\x{A0000}-\x{AFFFD}\x{B0000}-\x{BFFFD}\x{C0000}-\x{CFFFD}\x{D0000}-\x{DFFFD}\x{E1000}-\x{EFFFD}!\$&\'\(\)\*\+,;=:@])|[\x{E000}-\x{F8FF}\x{F0000}-\x{FFFFD}|\x{100000}-\x{10FFFD}\/\?])*)?(?:\#(?:(?:%[0-9a-f][0-9a-f]|[-a-z0-9\._~\x{A0}-\x{D7FF}\x{F900}-\x{FDCF}\x{FDF0}-\x{FFEF}\x{10000}-\x{1FFFD}\x{20000}-\x{2FFFD}\x{30000}-\x{3FFFD}\x{40000}-\x{4FFFD}\x{50000}-\x{5FFFD}\x{60000}-\x{6FFFD}\x{70000}-\x{7FFFD}\x{80000}-\x{8FFFD}\x{90000}-\x{9FFFD}\x{A0000}-\x{AFFFD}\x{B0000}-\x{BFFFD}\x{C0000}-\x{CFFFD}\x{D0000}-\x{DFFFD}\x{E1000}-\x{EFFFD}!\$&\'\(\)\*\+,;=:@])|[\/\?])*)?$/iu',$str_url);
 }
Run Code Online (Sandbox Code Playgroud)

这是对它的测试:

$urls=array('http://www.example.org/','http://www.example.org:80/','example.org','ftp://user:pass@example.org/','http://example.org/?cat=5&test=joo','http://www.fi/?cat=5&amp;test=joo','http://[::1]/','http://[2620:0:1cfe:face:b00c::3]/','http://[2620:0:1cfe:face:b00c::3]:80/','');
foreach ($urls as $a)
{
    echo $a."\n";
    $a=is_url($a);
    var_dump($a);
}
Run Code Online (Sandbox Code Playgroud)

而那些产出:

"http://www.example.org/" bool(true)
"http://www.example.org:80/" bool(true)
"example.org" bool(false)
"ftp://user:pass@example.org/" bool(true)
"http://example.org/?cat=5&test=joo" bool(true)
"http://www.fi/?cat=5&amp;test=joo" bool(true) 
"http://[::1]/" bool(true)
"http://[2620:0:1cfe:face:b00c::3]/" bool(true)
"http://[2620:0:1cfe:face:b00c::3]:80/" bool(true)
"" bool(false) …
Run Code Online (Sandbox Code Playgroud)

php regex url

17
推荐指数
1
解决办法
2734
查看次数

如何使用System.Uri .NET类检查URL是否有效?

之前的一篇文章中,建议使用System.Uri来检查URL是否有效.怎么做到这一点?

.net regex

16
推荐指数
3
解决办法
1万
查看次数

转义用户生成的聊天消息,但渲染链接

用户输入聊天消息,使用Mustache模板直接呈现给页面.显然,HTML应该被转义以防止HTML注入,但是再次链接应该呈现为<a href='...'>.

我尝试使用不同的方法{{{ ... }}}来返回未转义的HTML内容,这意味着链接将被呈现,我需要处理HTML转义自己.有没有一种安全的方法可以做到这一点,而不依赖于我自己写的半生不熟的解决方案?

jQuery.text()会很棒,但我想它会<a>再次呈现为文本.

我还能在这做什么?

html javascript jquery escaping mustache

15
推荐指数
1
解决办法
550
查看次数