从字符串中提取顶级域名 PHP

12
我需要从一个字符串中提取域名,该字符串可以是任何东西。例如:
$sitelink="http://www.somewebsite.com/product/3749875/info/overview.html";
或者
$sitelink="http://subdomain.somewebsite.com/blah/blah/whatever.php";
无论如何,我想提取“somewebsite.com”部分(可能是任何内容),并且舍弃其余部分。

你尝试过什么?对于一个常见的问题,简单的谷歌搜索会返回许多答案。 - Matt Clark
1
从URL中提取域名,包括难处理的情况 - idmean
1
可能是 在 PHP 中解析 URL 的域名 的重复问题。 - j0k
这个页面非常有用。谢谢。 - nooblag
6个回答

24

使用parse_url($url)

<?php
$url = 'http://username:password@hostname/path?arg=value#anchor';

print_r(parse_url($url));
?>

The above example will output:

Array
(
    [scheme] => http
    [host] => hostname
    [user] => username
    [pass] => password
    [path] => /path
    [query] => arg=value
    [fragment] => anchor
)

使用这些值

echo parse_url($url, PHP_URL_HOST); //hostname
$url_info = parse_url($url);
echo $url_info['host'];//hostname

我认为OP只想要二级域名。 - user652649
我会让原帖作者自己想办法如何使用该数组。 - Lawrence Cherone
好的,这看起来很有前途。我如何仅使用数组的主机部分将“host”部分转换为字符串并忽略其余部分?谢谢。 - nooblag
帖子中包含了手册链接,但我已经添加了如何访问这些值的说明。 - Lawrence Cherone
这真是太容易使用了,我很感激!它很适合我的 preg_replace_callback 中,我正在解析图像 URL 以显示 HTML 图像标签,并将域名作为匹配的照片(图像 URL)下的文本保留。谢谢! - WiiLF

5

这是它

<?php

$sitelink="http://www.somewebsite.com/product/3749875/info/overview.html";

$domain_pieces = explode(".", parse_url($sitelink, PHP_URL_HOST));

$l = sizeof($domain_pieces);

$secondleveldomain = $domain_pieces[$l-2] . "." . $domain_pieces[$l-1];

echo $secondleveldomain;

请注意,这可能不是您要寻找的行为,因为对于像此类的主机,它将不会起作用。
stackoverflow.co.uk

它将会输出"co.uk"


参见:

http://publicsuffix.org/learn/

http://www.dkim-reputation.org/regdom-libs/

http://www.dkim-reputation.org/regdom-lib-downloads/ <-- 这里可以下载,包含PHP版本


嗨,谢谢你的留言。你说得对,在这种情况下回响.co.uk没有帮助。如果可能的话,它需要能够处理任何域名(并剥离子域名)。无论如何感谢你。 - nooblag
你可以使用这个表格作为参考 https://wiki.mozilla.org/TLD_List 来构建你所需的内容。 - user652649

4

2个复杂的URL

$url="https://www.example.co.uk/page/section/younameit";
or
$url="https://example.co.uk/page/section/younameit";

为了获得 "www.example.co.uk":
$host=parse_url($url, PHP_URL_HOST);

仅获取“example.co.uk”
$parts = explode('www.',$host);
$domain = $parts[1];

// ...or...

$domain = ltrim($host, 'www.')

如果你的网址包含"www."或者不包含都会得到相同的结果,即"example.co.uk"。
好了!

2
您需要使用使用公共后缀列表(Public Suffix List)的软件包,只有这样您才能正确提取具有两级、三级顶级域名(co.uk,a.bg,b.bg等)和多级子域名。正则表达式、parse_url() 或字符串函数无法生成绝对正确的结果。
我推荐使用TLD Extract。以下是代码示例:
$extract = new LayerShifter\TLDExtract\Extract();

$result = $extract->parse('http://www.somewebsite.com/product/3749875/info/overview.html');
$result->getSubdomain(); // will return (string) 'www'
$result->getHostname(); // will return (string) 'somewebsite'
$result->getSuffix(); // will return (string) 'com'
$result->getRegistrableDomain(); // will return (string) 'somewebsite.com'

0

针对任何字符串,新的方法:

function extract_plain_domain($text) {

    $text=trim($text,"/");
    $text=strtolower($text);

    $parts=explode("/",$text);
    if (substr_count($parts[0],"http")) {
        $parts[0]="";
    }
    reset ($parts);while (list ($key, $val) = each ($parts)) {
            if (!empty($val)) { $text=$val; break; }
    }

    $parts=explode(".",$text);
    if (empty($parts[2])) {
        return $parts[0].".".$parts[1];
        } else {
        $num_parts=count($parts);
        return $parts[$num_parts-2].".".$parts[$num_parts-1];
        }

} // end function extract_plain_domain

0

您可以使用Utopia Domains库(https://github.com/utopia-php/domains),它将基于Mozilla公共后缀列表(https://publicsuffix.org)返回域TLD和公共后缀,可用作当前已归档的TLDExtract包的替代品。

您可以使用'parse_url'函数从URL中获取主机名,然后使用Utopia Domains解析器获取正确的TLD并将其与域名连接在一起:

<?php

require_once './vendor/autoload.php';

use Utopia\Domains\Domain;

$url = 'http://demo.example.co.uk/site';

$domain = new Domain(parse_url($url, PHP_URL_HOST)); // demo.example.co.uk

var_dump($domain->get()); // demo.example.co.uk
var_dump($domain->getTLD()); // uk
var_dump($domain->getSuffix()); // co.uk
var_dump($domain->getName()); // example
var_dump($domain->getSub()); // demo
var_dump($domain->isKnown()); // true
var_dump($domain->isICANN()); // true
var_dump($domain->isPrivate()); // false
var_dump($domain->isTest()); // false

var_dump($domain->getName().'.'.$domain->getSuffix()); // example.co.uk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接