使用 PHP 获取子域
Get Sub-domain with PHP
如何从 URL 获取子域名。假设 subdomain.example.com
,那么我只想要 subdomain
示例:
https://subdomain.example.com
https://anything.example.com/pathurl
输出:
Subdomain
anything
尝试对来自 Whosebug 的代码进行一些修改,但没有成功:(
$subdomain = substr($_SERVER['SERVER_NAME'],0,4) === '/^([^.]+)/' ? substr($_SERVER['SERVER_NAME'],0) : $_SERVER['SERVER_NAME'];
echo $subdomain;
你可以使用正则表达式。
preg_match('/^[^.]*\.(?=\w+\.\w+$)/',$_SERVER['SERVER_NAME'],$matches);
$subdomain = isset($matches[0]) ? trim($matches[0],'.') : '';
echo $subdomain;
这里是fiddle
像这样混合使用 parse_url()
和 strtok()
$url = 'https://anything.example.com/pathurl';
$bits = parse_url($url);
$sub = strtok($bits['host'], '.');
echo $sub;
结果
anything
首先,打破你的尝试:
$_SERVER['SERVER_NAME']
为您提供完整的服务器名称,例如“subdomain.example.com”
substr($_SERVER['SERVER_NAME'],0,4)
给出该字符串的前四个字符;您复制的示例可能是在寻找“www.”,它有四个字符长,但“subd”不会告诉您太多信息
===
只是比较两个东西是一样的;因为你只要求四个字符,所以它永远不会匹配任何其他长度的字符串
'/^([^.]+)/'
看起来像 Regular Expression (aka "regex") - a pattern to match strings; to use that in PHP, you need the PCRE family of functions,例如 preg_match
和 preg_replace
接下来,我总是给的提示:分解问题。暂时忘记您知道什么是子域,并注意您有一个字符串,并且想要所有文本直到第一个点。
因此,获得它的一种方法是在 每个 点上拆分字符串,然后取第一部分。为此,您将使用令人兴奋的名称 explode:
$subdomain = explode('.', $fulldomain, 1)[0];
另一种方法是使用您找到的正则表达式模式,它显示为“从头开始,匹配除点以外的任何内容,至少匹配一次,然后捕获该部分”。您实际上可以跳过一对括号,因为它们对整个模式进行了分组,所以 '/^[^.]+/'
就足够了。为此,您将使用 preg_match,但请注意,它不会 return 匹配的部分,而是将它们放在您传递给的额外数组中它:
$matches = null; // will be populated by preg_match
preg_match('/^[^.]+/', $fulldomain, $matches);
$subdomain = $matches[0];
注意: 以上将 return “Whosebug” 输入“whosebug.com”。这对于简单的字符串匹配是不可避免的,因为没有标准数量的段来标记“public 域”——例如“bbc.co.uk”与“bbc.com”的注册级别相同,但您无法通过查看它们来判断。除非你事先知道你可能的结局是什么,否则你需要一些东西来检查 Public Suffix List, such as the php-domain-parser library.
感谢@IMSoP、@RiggsFolly 和@Jerson。你所有的代码都很棒 :)
供我自己将来参考:
$fulldomain = $_SERVER['SERVER_NAME'];
$matches = null;
preg_match('/^[^.]+/', $fulldomain, $matches);
$subdomain = $matches[0];
echo $subdomain;
如何从 URL 获取子域名。假设 subdomain.example.com
,那么我只想要 subdomain
示例:
https://subdomain.example.com
https://anything.example.com/pathurl
输出:
Subdomain
anything
尝试对来自 Whosebug 的代码进行一些修改,但没有成功:(
$subdomain = substr($_SERVER['SERVER_NAME'],0,4) === '/^([^.]+)/' ? substr($_SERVER['SERVER_NAME'],0) : $_SERVER['SERVER_NAME'];
echo $subdomain;
你可以使用正则表达式。
preg_match('/^[^.]*\.(?=\w+\.\w+$)/',$_SERVER['SERVER_NAME'],$matches);
$subdomain = isset($matches[0]) ? trim($matches[0],'.') : '';
echo $subdomain;
这里是fiddle
像这样混合使用 parse_url()
和 strtok()
$url = 'https://anything.example.com/pathurl';
$bits = parse_url($url);
$sub = strtok($bits['host'], '.');
echo $sub;
结果
anything
首先,打破你的尝试:
$_SERVER['SERVER_NAME']
为您提供完整的服务器名称,例如“subdomain.example.com”substr($_SERVER['SERVER_NAME'],0,4)
给出该字符串的前四个字符;您复制的示例可能是在寻找“www.”,它有四个字符长,但“subd”不会告诉您太多信息===
只是比较两个东西是一样的;因为你只要求四个字符,所以它永远不会匹配任何其他长度的字符串'/^([^.]+)/'
看起来像 Regular Expression (aka "regex") - a pattern to match strings; to use that in PHP, you need the PCRE family of functions,例如preg_match
和preg_replace
接下来,我总是给的提示:分解问题。暂时忘记您知道什么是子域,并注意您有一个字符串,并且想要所有文本直到第一个点。
因此,获得它的一种方法是在 每个 点上拆分字符串,然后取第一部分。为此,您将使用令人兴奋的名称 explode:
$subdomain = explode('.', $fulldomain, 1)[0];
另一种方法是使用您找到的正则表达式模式,它显示为“从头开始,匹配除点以外的任何内容,至少匹配一次,然后捕获该部分”。您实际上可以跳过一对括号,因为它们对整个模式进行了分组,所以 '/^[^.]+/'
就足够了。为此,您将使用 preg_match,但请注意,它不会 return 匹配的部分,而是将它们放在您传递给的额外数组中它:
$matches = null; // will be populated by preg_match
preg_match('/^[^.]+/', $fulldomain, $matches);
$subdomain = $matches[0];
注意: 以上将 return “Whosebug” 输入“whosebug.com”。这对于简单的字符串匹配是不可避免的,因为没有标准数量的段来标记“public 域”——例如“bbc.co.uk”与“bbc.com”的注册级别相同,但您无法通过查看它们来判断。除非你事先知道你可能的结局是什么,否则你需要一些东西来检查 Public Suffix List, such as the php-domain-parser library.
感谢@IMSoP、@RiggsFolly 和@Jerson。你所有的代码都很棒 :)
供我自己将来参考:
$fulldomain = $_SERVER['SERVER_NAME'];
$matches = null;
preg_match('/^[^.]+/', $fulldomain, $matches);
$subdomain = $matches[0];
echo $subdomain;