1

如何从 URL 获取子域。说吧subdomain.example.com,那我只想要subdomain

例子 :

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

输出 :

Subdomain
anything

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

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

4 回答 4

3

首先,打破你的尝试:

  • $_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 库

于 2022-01-07T19:04:50.417 回答
2

你可以使用正则表达式。

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

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

echo $subdomain;

这是小提琴

于 2022-01-07T18:59:38.063 回答
2

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

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

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

结果

anything

演示

于 2022-01-07T19:04:23.883 回答
0

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

供我自己将来参考:

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

echo $subdomain;
于 2022-01-07T19:21:25.497 回答