获取基本域名php

时间:2018-09-02 23:23:58

标签: php

function getHost($Address) { 
    $parseUrl = parse_url(trim($Address)); 
    return trim($parseUrl[host]
            ? $parseUrl[host] 
            : array_shift(explode('/', $parseUrl[path], 2))
    ); 
} 

$httpreferer = getHost($_SERVER['HTTP_REFERER']);
$httpreferer = preg_replace('#^(http(s)?://)?w{3}\.#', '$1', $httpreferer);

echo $httpreferer; 

我正在使用它剥离http://,www和子域以仅返回主机,但是它返回以下内容:

http://site.google.com ==> google.com
http://google.com      ==> com

我如何获取它仅在存在子域时删除子域,而不是在不存在时将其剥离到tld?

2 个答案:

答案 0 :(得分:2)

parse_url开始,特别是parse_url($url)['host']

 $arr = parse_url($url);
 echo preg_replace('/^www\./', '', $arr['host'])."\n";

输出

site.google.com
google.com

Sandbox

如果它是字符串的开头,则此正则表达式仅与www.匹配,您可能可以通过几种方式来完成这一部分,例如

无子域

如果您根本不需要任何子域:

$arr = parse_url($url)['host'];
echo preg_replace('/^(?:[-a-z0-9_]+\.)?([-a-z0-9_]+\..+)$/', '$1',$arr['host'])."\n";

Sandbox

没有子域,没有国家/地区代码

$arr = parse_url($url)['host'];
echo preg_replace('/^(?:[-a-z0-9_]+\.)?([-a-z0-9_]+)(\.[^.]+).*?$/', '$1$2',$arr['host'])."\n";

Sandbox

工作原理

与上一个相同,但是域与主机分离,我们不仅捕获了所有内容,还捕获了.之外的所有内容,而在新组之外,我们捕获了所有内容(令人困惑的是。此处是所有内容)但是如果*?表示* 0次或多次,则?的非贪婪行为不会接受先前表达式中的字符。

或者换一种说法。捕获0次或多次的任何内容都不会从以前的比赛中窃取字符。这样,如果没有www.google.com之类的东西,我们只担心.com之后的东西,那么它的0个匹配项。但是,如果它的www.google.com.uk.uk相匹配。

单行答案

某些版本的PHP,我忘记了哪些版本,但是较新的版本实际上允许您执行此操作:

   $host = parse_url($url)['host'];

因此,以最后一个示例为例,我们可以将其压缩为一行并删除变量赋值。

  echo preg_replace('/^(?:[-a-z0-9_]+\.)?([-a-z0-9_]+)(\.[^.]+).*?$/', '$1$2',parse_url($url)['host'])."\n";

See it in action

那只是为了好玩!

摘要

使用parse_url确实是“正确”的方式。还是正确的开始方式,因为它消除了很多其他“东西”并为您提供了良好的起点。无论如何,这对我来说很有趣... :) ...而且我需要从编码我的网站上休息一下,因为它现在对我来说很繁琐(当时已经8岁了,所以我要在WordPress中重做它,而且我已经完成了无数的WordPress网站)...

干杯,希望对您有帮助!

答案 1 :(得分:0)

找到答案

$testAdd = "https://testing.google.co.uk";
$parse = parse_url($testAdd);
$httpreferer = preg_replace("/^([a-zA-Z0-9].*\.)?([a-zA-Z0-9][a-zA-Z0-9-]{1,61}[a-zA-Z0-9]\.[a-zA-Z.]{2,})$/", '$2', $parse['host']);


echo $httpreferer;

这还将处理与国家/地区顶级域名(TLD)相关的域名

感谢您的所有帮助。