防止使用url输入重复条目


Prevent duplicate entries with url inputs

我有一个输入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);

在上一次$搜索时,我想删除"/"之后的所有字符,包括"/"接下来是什么?

您可以使用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);

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

对于那些会遇到同样问题并点击此处的人,以下是这个的完整代码

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;