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?
发布于 2018-09-03 07:48:26
从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";那只是为了好玩!
Summery
使用parse_url确实是一种“正确”的方式。或者是正确的开始方式,因为它去掉了很多其他的“东西”,给了你一个很好的起点。无论如何,这对我来说很有趣... :) .我需要从我的网站编码中解脱出来,因为它现在对我来说太乏味了(它已经有8年的历史了,所以我正在用WordPress重新编写它,而且我已经完成了无数个WordPress站点)……
干杯,希望它能帮上忙!
发布于 2018-09-03 08:31:31
找到答案了
$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的域名
谢谢你的帮助。
https://stackoverflow.com/questions/52141692
复制相似问题