我正在寻找一种方法(或函数)来去除输入函数的任何 URL 的 domain.ext 部分。域扩展名可以是任何东西(.com、.co.uk、.nl、.whatever),输入的 URL 可以是从http://www.domain.com到 www.domain.com/path的任何东西/script.php?=随便
这样做的最佳方法是什么?
我正在寻找一种方法(或函数)来去除输入函数的任何 URL 的 domain.ext 部分。域扩展名可以是任何东西(.com、.co.uk、.nl、.whatever),输入的 URL 可以是从http://www.domain.com到 www.domain.com/path的任何东西/script.php?=随便
这样做的最佳方法是什么?
parse_url将 URL 转换为关联数组:
php > $foo = "http://www.example.com/foo/bar?hat=bowler&accessory=cane";
php > $blah = parse_url($foo);
php > print_r($blah);
Array
(
[scheme] => http
[host] => www.example.com
[path] => /foo/bar
[query] => hat=bowler&accessory=cane
)
您可以使用parse_url()来执行此操作:
$url = 'http://www.example.com';
$domain = parse_url($url, PHP_URL_HOST);
$domain = str_replace('www.','',$domain);
在这个例子中,$domain 应该包含 example.com,不管它是否有 www。它也适用于 .co.uk 等域
你也可以写一个正则表达式来得到你想要的。
这是我的尝试:
$pattern = '/\w+\..{2,3}(?:\..{2,3})?(?:$|(?=\/))/i';
$url = 'http://www.example.com/foo/bar?hat=bowler&accessory=cane';
if (preg_match($pattern, $url, $matches) === 1) {
echo $matches[0];
}
输出是:
example.com
此模式还考虑了诸如“example.com.au”之类的域。
注意:我没有查阅相关的 RFC。
以下代码将从绝对 URL 中修剪协议、域和端口:
$urlWithoutDomain = preg_replace('#^.+://[^/]+#', '', $url);
这里有几个简单的函数可以从普通或长域 (test.sub.domain.com) 或 url (http://www.example.com) 获取根域 (example.com)。
/**
* Get root domain from full domain
* @param string $domain
*/
public function getRootDomain($domain)
{
$domain = explode('.', $domain);
$tld = array_pop($domain);
$name = array_pop($domain);
$domain = "$name.$tld";
return $domain;
}
/**
* Get domain name from url
* @param string $url
*/
public function getDomainFromUrl($url)
{
$domain = parse_url($url, PHP_URL_HOST);
$domain = $this->getRootDomain($domain);
return $domain;
}
解决了这个...
假设我们正在调用 dev.mysite.com,我们想要提取“mysite.com”
$requestedServerName = $_SERVER['SERVER_NAME']; // = dev.mysite.com
$thisSite = explode('.', $requestedServerName); // site name now an array
array_shift($thisSite); //chop off the first array entry eg 'dev'
$thisSite = join('.', $thisSite); //join it back together with dots ;)
echo $thisSite; //outputs 'mysite.com'
也可以与 mysite.co.uk 一起使用,因此应该可以在任何地方使用 :)
我花了一些时间思考为此使用正则表达式是否有意义,但最后我认为不是。
firstresponder 的正则表达式几乎让我相信这是最好的方法,但它不适用于缺少斜杠的任何内容(例如http://example.com)。我用以下方法解决了这个问题:'/\w+\..{2,3}(?:\..{2,3})?(?=[\/\W])/i'
,但后来我意识到像“ http://example.com/index.htm ”这样的网址匹配两次。哎呀。这不会那么糟糕(只使用第一个),但它也匹配两次这样的东西:' http ://abc.ed.fg.hij.kl.mn/ ',第一个匹配是' t 正确的。:(
一位同事建议只获取主机(通过parse_url()
),然后只获取最后两个或三个数组位(split()
在“.”上)这两个或三个将基于域列表,例如“co.uk”,等等。组成那个列表成为困难的部分。
提取域部分只有一种正确的方法,它使用公共后缀列表(TLD 数据库)。我推荐TLDExtract包,这里是示例代码:
$extract = new LayerShifter\TLDExtract\Extract();
$result = $extract->parse('www.domain.com/path/script.php?=whatever');
$result->getSubdomain(); // will return (string) 'www'
$result->getHostname(); // will return (string) 'domain'
$result->getSuffix(); // will return (string) 'com'
此功能应该工作:
function Delete_Domain_From_Url($Url = false)
{
if($Url)
{
$Url_Parts = parse_url($Url);
$Url = isset($Url_Parts['path']) ? $Url_Parts['path'] : '';
$Url .= isset($Url_Parts['query']) ? "?".$Url_Parts['query'] : '';
}
return $Url;
}
要使用它:
$Url = "https://stackoverflow.com/questions/176284/how-do-you-strip-out-the-domain-name-from-a-url-in-php";
echo Delete_Domain_From_Url($Url);
# Output:
#/questions/176284/how-do-you-strip-out-the-domain-name-from-a-url-in-php