繁体   English   中英

使用 PHP 获取子域

[英]Get Sub-domain with PHP

如何从 URL 获取子域。 假设subdomain.example.com ,那么我只想要subdomain

例子:

https://subdomain.example.com
https://anything.example.com/pathurl

Output:

Subdomain
anything

尝试从stackoverflow进行一些修改但没有工作的代码:(

$subdomain = substr($_SERVER['SERVER_NAME'],0,4) === '/^([^.]+)/' ? substr($_SERVER['SERVER_NAME'],0) : $_SERVER['SERVER_NAME'];
echo $subdomain;

首先,打破你的尝试:

  • $_SERVER['SERVER_NAME']为您提供完整的服务器名称,例如“subdomain.example.com”
  • substr($_SERVER['SERVER_NAME'],0,4)为您提供该字符串的前四个字符; 您复制的示例很可能是在寻找“www.”,它有四个字符长,但“subd”不会告诉您太多信息
  • ===只是比较两件事是相同的; 因为您刚刚要求输入四个字符,所以它永远不会匹配任何其他长度的字符串
  • '/^([^.]+)/'看起来像正则表达式(又名“正则表达式”) - 匹配字符串的模式; 要在 PHP 中使用它,您需要PCRE 系列函数,例如preg_matchpreg_replace

接下来,我总是给出的提示:分解问题。 暂时忘记您知道什么是子域,并注意您有一个字符串,并希望所有文本都在第一个点之前。

因此,一种方法是在每个点上分割字符串,并取第一部分。 为此,您将使用令人兴奋的名称explode

$subdomain = explode('.', $fulldomain, 1)[0];

另一种方法是使用您找到的正则表达式模式,其内容为“从头开始,匹配除点以外的任何内容,至少一次,并捕获该部分”。 您实际上可以跳过一对括号,因为它们将整个模式分组,所以只需'/^[^.]+/'就足够了。 为此,您将使用preg_match ,但请注意,它不会返回匹配的部分,而是将它们放在您传递给它的额外数组中:

$matches = null; // will be populated by preg_match
preg_match('/^[^.]+/', $fulldomain, $matches);
$subdomain = $matches[0];

注意:对于“stackoverflow.com”的输入,上面将返回“stackoverflow”。 这对于简单的字符串匹配是不可避免的,因为没有标准的分段数量来标记“公共域”——例如“bbc.co.uk”注册在与“bbc.com”相同的级别,但你不能通过观察它们来告诉你。 除非你事先知道你可能的结局是什么,否则你需要一些检查公共后缀列表的东西,比如php-domain-parser 库

你可以使用正则表达式。

preg_match('/^[^.]*\.(?=\w+\.\w+$)/',$_SERVER['SERVER_NAME'],$matches);

$subdomain = isset($matches[0]) ? trim($matches[0],'.') : '';

echo $subdomain;

这是小提琴

像这样混合使用parse_url()strtok()

$url = 'https://anything.example.com/pathurl';

$bits = parse_url($url);
$sub = strtok($bits['host'], '.');
echo $sub;

结果

anything

感谢@IMSoP、@RiggsFolly 和@Jerson。 你所有的代码都很棒:)

供我自己将来参考:

$fulldomain = $_SERVER['SERVER_NAME'];
$matches = null; 
preg_match('/^[^.]+/', $fulldomain, $matches);
$subdomain = $matches[0];

echo $subdomain;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM