【问题标题】:Prevent duplicate entries with url inputs防止带有 url 输入的重复条目
【发布时间】:2012-08-02 04:06:49
【问题描述】:

我有一个输入 url 的表单

用户可以动态输入

www.stack.com  or
www.stack.com/overflow  or
http://www.stack.com  or
http://www.stack.com/overflow

如何防止将重复条目插入到我的数据库中?

这些我都试过了

$url = (input url)

$search = str_replace("http://www.", "", $url);
$search = str_replace("http://", "", $url);
$search = str_replace("www.", "", $url);
$search = str_replace("/", "", $url);

在最后一次 $search 中,我想删除 "/" 之后的所有以下字符,包括 "/" 接下来是什么?

【问题讨论】:

  • 您是否要仅保存hostname?如果是这样,您是否已经看过parse_url

标签: php url duplicates


【解决方案1】:

您可以使用 PHP 的 parse_url() 方法为您完成所有工作:

$url = ((strpos($url, 'http://') !== 0) && (strpos($url, 'https://') !== 0)) ? 'http://'.$url : $url;
$parsed = parse_url($url);
$host = $parsed['host'];

第一行将验证给定 URL 中是否存在 http://https:// 的方案。如果没有,它将在前面添加默认值 http://。如果没有给定的方案,parse_url() 会将整个 URL 放入 path 索引中。有了它,它将正确解析主机。

或者,由于您只需要域名,您可以将PHP_URL_HOST 标志添加到方法调用中:

$url = ((strpos($url, 'http://') !== 0) && (strpos($url, 'https://') !== 0)) ? 'http://'.$url : $url;
$host = parse_url($url, PHP_URL_HOST); // this will return just the host-portion.

通常,您会希望保留给定 URL 的子域名,因为子域可能会有很大差异(甚至是完全不同的网站)。但是,在www. 的情况下,通常情况并非如此。鉴于上述关于如何获取当前域的语句之一,您可以使用以下命令删除 www.

$host = str_replace('www.', '', $host);

【讨论】:

  • 您好,刚刚完成了这个功能的测试。 parse_url() 不会按预期工作,看看这个:$url='www.stack.com/overflow'; var_export(parse_url($url)); 这个返回:array ( 'path' => 'www.stack.com/overflow', ) 我想她应该更好地使用this regexp
  • @Stano 它仍然有效,但是主机名将在path 参数中,而不是host 参数中;我会更新我的答案以反映。
  • 感谢@newfurniturey,我使用了 $host = parse_url($url, PHP_URL_HOST); $host = str_replace('www.', '', $host);一个问题,所有的主机名都是以“www”开头的还是除了“www”之外还有别的吗?抱歉,我对这件事不熟悉。
  • @IvorySantos 如果网站有子域,例如mail.google.com,则不包括www.,而是mail.。另一个例子是security.stackexchange.com;此处,子域为security,规范名称www 不适用。
【解决方案2】:

newfurniturey 的回答似乎是一个很好的解决方案。在调用 parse_url 之前,您可以检查 url 中是否缺少 http://,如果是,那么您可以在字符串前面加上 http://,然后 parse_url 应该按预期工作

【讨论】:

    【解决方案3】:

    对于那些会坚持同样的问题并放弃这里的人,这里是完整的代码

    if((strpos($url, 'http://')  !== false) || (strpos($url, 'https://')  !== false)) 
    {   $host = parse_url($url, PHP_URL_HOST); 
        if (strpos($url, 'www.') !== false)
            $host = str_replace('www.', '', $host);
        if (strpos($host, '/') !== false)
        {   $str = explode("/", $host);
            $host = $str[0];
        }
    }
    
    else if (strpos($url, 'www.') !== false)
    {   $host = str_replace('www.', '', $url);
        if (strpos($host, '/') !== false)
        {   $str = explode("/", $host);
            $host = $str[0];
        }
    
    }
    else if (strpos($url, '/') !== false)
        {   $str = explode("/", $url);
            $host = $str[0];
        }
    
    else $host = $url;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-29
      • 2012-02-07
      • 2012-04-15
      • 1970-01-01
      相关资源
      最近更新 更多