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