【问题标题】:PHP check if string contains url without http://PHP检查字符串是否包含不带http://的url
【发布时间】:2012-01-05 06:33:27
【问题描述】:

查找字符串是否包含 url 的最佳方法是什么?

我正在写一个聊天框,需要拒绝在其中发布 url...

if(preg_match('/[a-zA-Z]+:\/\/[0-9a-zA-Z;.\/?:@=_#&%~,+$]+/', $clean_message, $matches))
{
die('INVALID!');
}

似乎对包含 http:// 的网址有效,但我还需要能够拒绝 youtube.com 等网址以及是否发布了 IP 地址等。

我需要保持聊天框的清洁,防止用户发送垃圾网址!

【问题讨论】:

  • 何必呢?你永远不会停止像 www [dot] youtube [dot] com 这样的东西。过滤自动垃圾邮件发布,然后放手?
  • 我可以向这样的 URL 发送垃圾邮件: s t a c k o v e r f l o w 。 c o m
  • 您可以像 Office Communicator 一样,只需将 _ 添加到已知的 Web 协议。喜欢:_http://www.example.com。然后由另一端的人来跟进。
  • @Brad, str_replace("[dot]", ".", $url);
  • @E3pO:无论你想出什么规则,我都能想出一个规避它的方法。

标签: php string url preg-match contains


【解决方案1】:

可能你能做的最好的事情是:

/[\w\d\.]+\.(com|org|ca|net|uk)/

并添加所有其他常见的后缀。做类似的事情:

/[\w\d\.]+\.[\w\d]{1,3}/

可能过于笼统,但几乎可以捕捉到任何看起来像 URL 的东西。

【讨论】:

  • 现在效果很好,但我们遇到了人们说“wow.that.is.cool!”之类的话的问题
  • wow.that.is.cool 可能是一个 url,我认为没有办法知道它不是。
  • 您将不得不决定在允许某些网址通过和不让用户输入他们想要的不是网址的内容之间划清界限。无论如何,你最终都会得到一点。
  • 实际上我刚刚意识到还有另一个问题,这将阻止“100.00”。您可能应该将 [\w\d\.] 替换为 [\w\d\.]*\w[\w\d\.]*
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-02-07
  • 2012-03-28
  • 2011-09-26
  • 2012-06-23
  • 2014-03-10
  • 2014-07-04
  • 2013-10-26
相关资源
最近更新 更多