Php 从域字符串获取主域

Php 从域字符串获取主域,php,string,Php,String,在php中有一个类似于third.second.tld或fourth.third.second.tld的字符串。提取主域名(second.tld)的最简单和最好的方法是什么 我试过这个 $domain = 'fourth.third.second.tld'; $topLevel = array_reverse(explode('.', $domain))[0]; $secondLevel = array_reverse(explode('.', $domain))[1]; $mainDo

在php中有一个类似于
third.second.tld
fourth.third.second.tld
的字符串。提取主域名(second.tld)的最简单和最好的方法是什么

我试过这个

 $domain = 'fourth.third.second.tld';
 $topLevel = array_reverse(explode('.', $domain))[0];
 $secondLevel = array_reverse(explode('.', $domain))[1];
 $mainDomain = $secondLevel . '.' . $topLevel;
但我觉得有点复杂。有更简单的方法吗?

或者您可以使用regex

$domain = 'fourth.third.second.tld';

$parts = explode(".", $domain);

$lastParts = array_slice($parts, -2);

$mainDomain = join(".", $lastParts);

//output: second.tld
$a = 'fourth.third.second.tld';
$b = 'third.second.tld';
$c = 'second.tld';

function getDomainName($str) {
    $r = preg_replace('/(\w*)(\.)(\w*)$/', '', $str);
    return str_replace($r, '', $str);
}

echo getDomainName($a);

echo "\n";

echo getDomainName($b);

echo "\n";

echo getDomainName($c);
结果将是

second.tld
second.tld
second.tld
或者您可以使用regex

$a = 'fourth.third.second.tld';
$b = 'third.second.tld';
$c = 'second.tld';

function getDomainName($str) {
    $r = preg_replace('/(\w*)(\.)(\w*)$/', '', $str);
    return str_replace($r, '', $str);
}

echo getDomainName($a);

echo "\n";

echo getDomainName($b);

echo "\n";

echo getDomainName($c);
结果将是

second.tld
second.tld
second.tld

这比你想象的要复杂-一定要使用专门为此类操作构建的库。否则,您可能会发现不同TLD的各种陷阱。例如,在.com域中,第二级通常是“主域”,但英国用户习惯于在第三级找到“主域”的.co.UK域


是为PHP构建的库之一,自述文件从一个示例开始,以提取和拆分TLD、“主域”和子域。TLDExtract也支持IDNA编码的域(国际化域名)。

它比您想象的要复杂——请使用专门为此类操作构建的库。否则,您可能会发现不同TLD的各种陷阱。例如,在.com域中,第二级通常是“主域”,但英国用户习惯于在第三级找到“主域”的.co.UK域


是为PHP构建的库之一,自述文件从一个示例开始,以提取和拆分TLD、“主域”和子域。TLDExtract也支持IDNA编码域(国际化域名)。

多个
explode()
s和
array\u reverse()
s可能会很昂贵。将分解和反转保存到一个变量中,然后访问
[0]
[1]
[2]
等…一次拆分和
array\u pop
两次并最终内爆,或者regexMultiple
explode()
array\u reverse()
可能会很昂贵。将分解和反转保存到一个变量中,然后访问
[0]
[1]
[2]
,等等…拆分一次,然后
数组弹出两次,最后内爆,或者regexHow它在
$a='max.möhres.söhne.tld'上工作吗$b='xn--shne-5qa.tld'$c='my domain.tld'
?如果你能读懂正则表达式,那就很简单了——它从字符串的末尾得到了“wordDOTword”,我能读懂正则表达式。试试我的示例数据。作为更好的近似值,您应该使用
[^.]
而不是单词字符。后者匹配许多编程语言的标识符。那么,像example.com.au这样的域名就有问题了。假设有人注册了域“com.au”,并创建了一个子域。它被称为“images.com.au”。还有一个人注册了“images.com.au”。如何找到真正的主机和tld/sld。现在这是一个有用的注释,提供有用的注释/答案总是一个很好的开始方式,
$a='max.möhres.söhne.tld'$b='xn--shne-5qa.tld'$c='my domain.tld'
?如果你能读懂正则表达式,那就很简单了——它从字符串的末尾得到了“wordDOTword”,我能读懂正则表达式。试试我的示例数据。作为更好的近似值,您应该使用
[^.]
而不是单词字符。后者匹配许多编程语言的标识符。那么,像example.com.au这样的域名就有问题了。假设有人注册了域“com.au”,并创建了一个子域。它被称为“images.com.au”。还有一个人注册了“images.com.au”。如何找到真正的主机和tld/sld。现在这是一个有用的注释,提供有用的注释/答案总是一个很好的开始。这应该是公认的答案。(+1)只有在少数情况下,我们知道可能的输入数据(永远不会更改的固定输入表),我们才可以依赖一个简单的实现。这应该是公认的答案。(+1)只有在少数情况下,我们知道可能的输入数据(永远不会更改的固定输入表),我们才可以依赖一个简单的实现。