[英]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_match
和preg_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.