我有一个输入网址的表单
动态地,用户可以输入
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中,我想在“/”之后删除所有以下字符,包括“/” 接下来会发生什么?
答案 0 :(得分: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://
的方案。如果没有,它将预设默认值http://
。如果没有给定的方案,parse_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.
通常,您希望保留给定网址的子域名,因为子域名可能差异很大(甚至是完全不同的网站)。但是,在www.
的情况下,通常情况并非如此。鉴于以上关于如何获取当前域的声明之一,您可以使用以下命令删除www.
$host = str_replace('www.', '', $host);
答案 1 :(得分:1)
通过newfurniturey回答似乎是非常好的解决方案。在调用parse_url之前,你可以运行一次检查,如果url中缺少http://,如果是,那么你可以在http://之前添加字符串,并且parse_url应该按预期工作
答案 2 :(得分: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;