如何从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;
首先,要分解您的尝试:
$_SERVER['SERVER_NAME']
为您提供完整的服务器名称,例如";subdomain.example.com">substr($_SERVER['SERVER_NAME'],0,4)
为您提供该字符串的前四个字符;你复制的例子很可能是在寻找";www.";,它有四个字符长;子d";不会告诉你太多- CCD_ 5只是比较了两个事物是相同的;因为你只要求四个字符,所以它永远不会匹配任何其他长度的字符串
'/^([^.]+)/'
看起来像正则表达式(又称"regex"(——一种匹配字符串的模式;要在PHP中使用它,您需要PCRE系列函数,如preg_match
和preg_replace
接下来,我一直给出的建议是:分解问题。暂时忘记你知道子域是什么,并注意到你有一个字符串,并且希望所有文本都到第一个点。
因此,一种方法是将上的字符串拆分为每个点,并取第一部分。为此,您可以使用名称令人兴奋的爆炸:
$subdomain = explode('.', $fulldomain, 1)[0];
另一种方法是使用您找到的regex模式,它读作";从一开始,匹配除了一个点之外的任何东西,至少匹配一次,并捕获该部分";。实际上,您可以跳过一对括号,因为它们对整个模式进行分组,所以仅'/^[^.]+/'
就足够了。要做到这一点,您可以使用preg_match,但请注意,它不会返回匹配的部分,而是将它们放在您传递给它的一个额外数组中:
$matches = null; // will be populated by preg_match
preg_match('/^[^.]+/', $fulldomain, $matches);
$subdomain = $matches[0];
注意:以上内容将返回"stackoverflow";对于"0"的输入;stackoverflow.com";。这对于简单的字符串匹配来说是不可避免的,因为没有标准数量的段来标记"0";公共领域"-例如";bbc.co.uk"在与";bbc.com";,但你不能通过看它们来判断。除非您事先知道可能的词尾是什么,否则您需要检查公共后缀列表的东西,例如php域解析器库。
您可以使用regex。
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、@RiggsFilly和@Jerson。你所有的代码工作惊人:(
供我将来参考:
$fulldomain = $_SERVER['SERVER_NAME'];
$matches = null;
preg_match('/^[^.]+/', $fulldomain, $matches);
$subdomain = $matches[0];
echo $subdomain;