【问题标题】:Get Sub-domain with PHP使用 PHP 获取子域
【发布时间】:2022-01-07 18:51:09
【问题描述】:

如何从 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;

【问题讨论】:

    标签: php html regex subdomain server-name


    【解决方案1】:

    首先,打破你的尝试:

    • $_SERVER['SERVER_NAME'] 为您提供完整的服务器名称,例如“子域.example.com”
    • substr($_SERVER['SERVER_NAME'],0,4) 为您提供该字符串的前四个字符;您复制的示例很可能是在寻找“www.”,它有四个字符长,但“subd”不会告诉您太多
    • === 只是比较两件事是相同的;由于您刚刚要求输入四个字符,因此它永远不会匹配任何其他长度的字符串
    • '/^([^.]+)/' 看起来像 Regular Expression(又名“正则表达式”)——匹配字符串的模式;要在 PHP 中使用它,您需要 the PCRE family of functions,例如 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”在同一级别注册,但您无法通过查看它们来判断。除非你提前知道你可能的结局是什么,否则你需要检查Public Suffix List的东西,比如the php-domain-parser library

    【讨论】:

    • 这个问题是如果没有子域它会返回主机
    • @Jerson 除非您集成Public Suffix List,否则这是不可避免的:“域”和“子域”之间没有普遍的区别。我将在警告中对此进行编辑。
    【解决方案2】:

    你可以使用正则表达式。

    preg_match('/^[^.]*\.(?=\w+\.\w+$)/',$_SERVER['SERVER_NAME'],$matches);
    
    $subdomain = isset($matches[0]) ? trim($matches[0],'.') : '';
    
    echo $subdomain;
    

    这里是fiddle

    【讨论】:

    • 这对于域中超过三个段的任何内容都返回空,例如“softwareengineering.meta.stackexchange.com”或“www.bbc.co.uk”;我的回答将返回“软件工程”和“www”;使用公共后缀列表的库将能够为您提供“softwareengineering.meta”和“www”。
    • Demo1Demo2 这不起作用
    • @RiggsFolly 在 demo1 操作中使用 SERVER NAME 所以它不会返回方案,在演示 2 中它将为空,因为 url 中有子域,但是三个段在这个中不起作用
    • 没有子域,错字错误我的错
    【解决方案3】:

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

    $url = 'https://anything.example.com/pathurl';
    
    $bits = parse_url($url);
    $sub = strtok($bits['host'], '.');
    echo $sub;
    

    结果

    anything
    

    Demo

    【讨论】:

    • 我试过$url = $_SERVER['SERVER_NAME']; $bits = parse_url($url); $sub = strtok($bits['host'], '.'); echo $sub;但没有结果
    • 嗯,这取决于$_SERVER['SERVER_NAME'] 中的内容,你能回应一下并告诉我
    • echo $_SERVER['SERVER_NAME']; 结果是www.example.com
    • 那么应该显示example
    • PS 您无法在该工具中访问$_SERVER['SERVER_NAME'];
    【解决方案4】:

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

    供我以后参考:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-02-11
      • 2011-02-10
      • 1970-01-01
      • 2016-01-13
      • 2012-01-19
      • 2011-07-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多