-5

我有一个输入 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 中,我想删除“/”之后的所有以下字符,包括“/”接下来是什么?

4

3 回答 3

3

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

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

第一行将验证方案是否http://存在https://于给定的 URL 中。如果没有,它将在前面添加一个默认值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);
于 2012-08-04T09:23:53.093 回答
1

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

于 2012-08-04T09:39:25.003 回答
0

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

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;
于 2012-08-06T05:18:48.707 回答