在php中清理网址

时间:2011-03-24 19:58:12

标签: php

我正在尝试让用户提交链接框。我一整天都在努力,似乎无法让它发挥作用。

目标是将所有这些变成example.com ...(即删除顶级域名之前的所有内容)

输入为$url =

他们有4种类型的网址:

www.example.com...
example.com...
http://www.example.com...
http://example.com...

我制作的所有作品都适用于1种或2种类型,但不是全部4种。

如何做到这一点?

3 个答案:

答案 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)

您的输入可以是

输出是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域,就不容易获得域名。