我正在尝试让用户提交链接框。我一整天都在努力,似乎无法让它发挥作用。
目标是将所有这些变成example.com ...(即删除顶级域名之前的所有内容)
输入为$url =
他们有4种类型的网址:
www.example.com...
example.com...
http://www.example.com...
http://example.com...
我制作的所有作品都适用于1种或2种类型,但不是全部4种。
如何做到这一点?
答案 0 :(得分:1)
您可以使用parse_url
。例如:
function parse($url) {
$parts = parse_url($url);
if ($parts === false) {
return false;
}
return isset($parts['scheme'])
? $parts['host']
: substr($parts['path'], 0, strcspn($parts['path'], '/'));
}
这将留下“www。”部分如果它已经存在,但用例如它来减少它是微不足道的str_replace
。如果您提供的网址严重格式错误,则会返回false
。
更新(改进的解决方案):
我意识到如果你试图用力欺骗它,上述方法将无法正常工作。因此,我意识到这样做会更好,而不是鞭打自己试图弥补自己:
function parse($url) {
$parts = parse_url($url);
if ($parts === false) {
return false;
}
if (!isset($parts['scheme'])) {
$parts = parse_url('http://'.$url);
}
if ($parts === false) {
return false;
}
return $parts['host'];
}
答案 1 :(得分:0)
您的输入可以是
$ url_arr = parse_url($ url);
echo $ url_arr ['host'];
输出是example.com
答案 2 :(得分:0)
您可以采取一些步骤来获取干净的网址。
首先,您需要确保有一个协议使parse_url正常工作,以便您可以这样做:
//Make sure it has a protocol
if(substr($url,0,7) != 'http://' || substr($url,0,8) != 'https://')
{
$url = 'http://' . $url;
}
现在我们通过parse_url()
$segments = parse_url($url);
但这就是它变得复杂的地方,因为构建域名的方式是你可以拥有1,2,3,4,5,6 .. .domain级别,这意味着你无法从所有网址中检测到域名,你必须有一个预编译的tld列表来检查域的最后部分,这样你就可以提取离开网站的域。
此处有一个列表:http://mxr.mozilla.org/mozilla-central/source/netwerk/dns/effective_tld_names.dat?raw=1
但是你最好将这个列表解析成mysql,然后选择tld与域字符串左侧匹配的行。
然后按长度排序并限制为1,如果找到,则可以执行以下操作:
$db_found_tld = 'co.uk';
$domain = 'a.b.c.domain.co.uk';
$domain_name = substr($domain,0 - strlen($db_found_tld));
这将离开a.b.c.domain
,因此您已删除了tld,现在域名将被提取,如下所示:
$parts = explode($domain_name);
$base_domain = $parts[count($parts) - 1];
现在你有domain
。
这看起来非常冗长,但我希望你现在知道,如果没有tld或sub域,就不容易获得域名。