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?
答案 0 :(得分:2)
从parse_url
开始,特别是parse_url($url)['host']
$arr = parse_url($url);
echo preg_replace('/^www\./', '', $arr['host'])."\n";
输出
site.google.com
google.com
如果它是字符串的开头,则此正则表达式仅与www.
匹配,您可能可以通过几种方式来完成这一部分,例如
无子域
如果您根本不需要任何子域:
$arr = parse_url($url)['host'];
echo preg_replace('/^(?:[-a-z0-9_]+\.)?([-a-z0-9_]+\..+)$/', '$1',$arr['host'])."\n";
没有子域,没有国家/地区代码
$arr = parse_url($url)['host'];
echo preg_replace('/^(?:[-a-z0-9_]+\.)?([-a-z0-9_]+)(\.[^.]+).*?$/', '$1$2',$arr['host'])."\n";
工作原理
与上一个相同,但是域与主机分离,我们不仅捕获了所有内容,还捕获了.
之外的所有内容,而在新组之外,我们捕获了所有内容(令人困惑的是。此处是所有内容)但是如果*?
表示*
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";
那只是为了好玩!
摘要
使用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)相关的域名
感谢您的所有帮助。