我正在寻找一种方法(或函数)去掉任何提供给函数的URL的domain.ext部分。域扩展名可以是任何内容(.com,.co.uk,.nl,.whatever),并且提供给它的URL可以是从http://www.domain.com到www.domain.com/path/script.php的任何内容。 ?=任何
最好的办法是什么?
答案 0 :(得分:90)
parse_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
)
答案 1 :(得分:11)
您可以使用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等域名。
答案 2 :(得分:10)
您还可以编写正则表达式以获得您想要的内容。
以下是我的尝试:
$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。
答案 3 :(得分:2)
以下是一些简单的函数,用于从普通域或长域(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;
}
答案 4 :(得分:1)
解决了这个......
假设我们正在调用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,所以应该在任何地方工作:)
答案 5 :(得分:1)
以下代码将从绝对URL中修剪协议,域和端口:
$urlWithoutDomain = preg_replace('#^.+://[^/]+#', '', $url);
答案 6 :(得分:0)
我花了一些时间考虑为此使用正则表达式是否有意义,但最终我认为不是。
firstresponder的正则表达式接近说服我这是最好的方法,但它对任何缺少尾部斜线的东西都没有用(例如http://example.com)。我使用以下内容修复了此问题:'/\w+\..{2,3}(?:\..{2,3})?(?=[\/\W])/i'
,但后来我意识到匹配两次,例如“http://example.com/index.htm”。哎呀。这不会那么糟糕(只使用第一个),但它也匹配两次:'http://abc.ed.fg.hij.kl.mn/',第一场比赛不正确。 :(
一位同事建议刚刚获取主机(通过parse_url()
),然后只取最后两个或三个数组位(split()
on'。')这两个或三个将基于在域名列表中,例如'co.uk'等。制作该列表成为困难的部分。
答案 7 :(得分:0)
只有一种正确的方法来提取域名部分,它使用Public Suffix List(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'
答案 8 :(得分:0)
此功能应该起作用:
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