首先,打破你的尝试:
$_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 库。