PHP中用于检查任何子域的正则表达式规则

PHP中用于检查任何子域的正则表达式规则,php,regex,cross-domain,Php,Regex,Cross Domain,我正在尝试使用Regex检查或验证子域/域,请检查这是我想要的: if($_SERVER['HTTP_ORIGIN'] == "^(.*\.?domain\.com)$"){ header('Access-Control-Allow-Origin: '.$_SERVER['HTTP_ORIGIN']); } 因此,如果子域是:es.domain.com、en.domain.com、etc.domain.com、domain.ws、test.com,那么我可以打印头策略 更多说明:我有几个

我正在尝试使用Regex检查或验证子域/域,请检查这是我想要的:

if($_SERVER['HTTP_ORIGIN'] == "^(.*\.?domain\.com)$"){
   header('Access-Control-Allow-Origin: '.$_SERVER['HTTP_ORIGIN']);
}
因此,如果子域是:es.domain.com、en.domain.com、etc.domain.com、domain.ws、test.com,那么我可以打印头策略

更多说明:我有几个子域(大约40个)和另外两个域(总共3个域),我需要知道$\u SERVER['HTTP\u ORIGIN']是否等于这个域或子域中的一个,如果相等,那么我打印头策略

我想用正则表达式来实现这一点,因为如果我将子域/域放在列表中,这将太长。有什么帮助吗


简历:我有三个域:domain.com、domain.ws和test.com(每个域有哪些子域),我希望通过此验证。

好吧,PHP有
preg.*
函数用于正则表达式。就你而言:

if(preg_match('/^(?:.+\.)?domain\.com$/', $_SERVER['HTTP_ORIGIN']))
如果您想更具体地说明允许的域和子域(允许任何组合-我假设第二级域是别名):

将允许您提到的任何主机名

或者,您可以允许任何子域和域,然后检查它们。假设您有一个允许的子域数组和一个允许的二级域数组

preg_match('/^(?:(.+)\.)?([^.]+\.[^.]+)$/', $_SERVER['HTTP_ORIGIN'], $matches);
$subdomain = $matches[1];
$domain = $matches[2];
if((!$subdomain || in_array($subdomain, $subdomainArray)) &&
   in_array($domain, $domainArray))
{
    ...
}
试试这个

preg_match("/".addcslashes($_SERVER["DOCUMENT_ROOT"],"/")."\/(\w+)\//",$_SERVER["SCRIPT_FILENAME"],$d);

$sub = $d[1];

谢谢buettner先生的回复。第一个代码可以帮助我,但只针对一个域(domain.com)。我放的其他东西不是我需要的,也许我犯了一个错误,因为我知道唯一的区别是数字。其他两个域(除了“domain.com”)看起来更像:“domain.ws”(和“subdomains”)和“.test.com”(和“subdomains”)。我将编辑我的问题。不太可能,因为我有太多的子域,不仅是es | en |等,而且如果我创建另一个子域,那么我也必须编辑这个规则。第一个很完美,但只适用于一个域,除了三个域之外,还有没有其他类似的方法?@Saymon我做了另一个编辑,显示了不同的方法。任何一组括号(不以
?:
开头)都将在
$matches
数组中创建一个元素,其中包含括号内匹配的内容。
preg_match("/".addcslashes($_SERVER["DOCUMENT_ROOT"],"/")."\/(\w+)\//",$_SERVER["SCRIPT_FILENAME"],$d);

$sub = $d[1];