【问题标题】:Getting base domain name php获取基础域名php
【发布时间】:2018-09-03 09:50:45
【问题描述】:
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?

【问题讨论】:

  • 这听起来像是一个非常困难的问题,因为 "subdomain" 并没有真正的意义。像.co.uk 这样的顶级域名你也会遇到很多困难
  • 你的意思是它返回http://site.google.com,因为这不会删除它见regex101.com/r/y1pVjt/1
  • @ArtisticPhoenix 感谢您添加。我盯着 OP 的正则表达式并在想 "但这只会删除 'www.'"
  • 据我所知,该功能会删除除主机和子域之外的所有内容,然后 preg_replace 检查 www 或句点并在它离开域之前消除所有内容,但它似乎只适用于 www。而不是子域。例如,如果推荐人是 http://www。 site.com 返回变量将是 site.com ,但是如果引用者是 http:// sub.site.com ,则返回将是 sub.site.com 及其子。我想删除。
  • 您最好从 URL 获取主机,然后解析来自 dig 查询或其他内容的响应。您也可以通过一次调用从 parse_url 获取主机,parse_url($url, PHP_URL_HOST)

标签: php


【解决方案1】:

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 次或多次,? non-greedy 不会从先前的表达式中获取字符。

或者换一种说法。捕获任何内容 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 网站)...

干杯,希望对你有帮助!

【讨论】:

  • 是的,但没有 http:// 并且您可以看到子域仍然存在,所以问题是在 preg_replace 中放置什么来删除子域而不是主机,这是一个问题。
  • 没有协议的代码实际上带回了 www。
  • 据我所见,从地址中删除子域比您想象的要困难得多。我浏览了整个网络,上面的代码是我发现的唯一一个删除了我需要的所有内容,除了该死的子域哈哈。
  • 要删除所有子域吗?
  • 在那里我删除了一些不必要的东西,并清理了它。
【解决方案2】:

找到答案

$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 的域

感谢您的所有帮助。

【讨论】:

  • 您不应在发布问题时发布答案,这可能会使某些用户感到困惑。更不用说正则表达式“丑陋”了,试试这个吧/^(?:[-a-z0-9_]+\.)?([-a-z0-9_]+\..+)$/
  • 如果您找到解决方案,它确实提供了发布和回答您自己的问题的选项
  • 这个会删除国家部分/^(?:[-a-z0-9_]+\.)?([-a-z0-9_]+)(\.[^.]+).*?$/所以http://site.google.com.uk变成google.com
  • 但我认为您不能将其标记为已回答。这是我的观点,如果有 4 或 5 个答案,并且作为 OP,您发布自己的答案,很难从其他答案中挑选出来。更好的做法是在问题主体的末尾加上**SOLVED** {bold} 并将答案放在下面,这样其他用户就不必通读所有其他帖子来弄清楚。无论如何,这就是我的观点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-07-21
  • 1970-01-01
  • 1970-01-01
  • 2023-03-18
  • 2011-04-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多