正则表达式:如何扩展域名的正则表达式以包含类型为a.b.c.d的域?

时间:2015-06-11 09:34:30

标签: regex subdomain

以下正则表达式会选择mail.example.com

形式的大多数邮件服务器名称
([a-zA-Z0-9-]+\.{1,}[a-zA-Z0-9-]+\.[a-zA-Z0-9-]{2,})

如图所示here

我们如何扩展它以使其与一个(或多个)其他子域匹配域,例如

b-app05-06.boldchat.com
ns126a.ba1.enops.net
NHQSDFEXCHUB01.nam.coair.com
ncsmcexchub01.nam.coair.com

4 个答案:

答案 0 :(得分:2)

您可以将最后一个子模式封装到非捕获组中并设置+量词:

\b[\w-]+(?:\.[\w-]+){2,}\b

说明:

  • \b - 字边界
  • [\w-]+ - 与字母数字或连字符匹配的字符类
  • (?:\.[\w-]+){2,} - 一个非捕获组,匹配2个或更多字面点和1个或多个字母数字字符或连字符的序列
  • \b - 字边界

请参阅demo

答案 1 :(得分:2)

你可以做得更短:

$collector = 'Jenny';
$sample_name = 'sample001';
$query = 'UPDATE sample SET collector_name = ? WHERE sample_name = ?';

if($stmt = $dbc ->prepare($query)) {                 
    $stmt->bind_param('ss', $collector, $sample_name);
    $stmt -> execute();
    $rows_affected = $stmt ->affected_rows;
    $stmt -> close();

    //check if add was successful or not. Tell the user
    if($rows_affected >= 0){
        echo "test".$dbc->info;
        if($dbc->info == NULL){
            echo "nullll";
        }
    }
    else{
        echo "update failed";
    }
}
else{
        echo "preparedfailed";
}
?>

Demo

答案 2 :(得分:2)

首先,以下是如何匹配一个域(给出您的示例):

((?:[a-zA-Z0-9-]+\.)+[a-zA-Z0-9-]{2,})$

tld匹配:

[a-zA-Z0-9]+(?:-[a-zA-Z0-9]+)*

现在,您可以将多个域用点分隔,然后是tld:

[a-z]{2,}

Regular expression visualization

Debuggex Demo

如果您需要匹配由至少2个子域+ tld组成的域:

((?:[a-zA-Z0-9]+(?:-[a-zA-Z0-9]+)*\.)+[a-z]{2,})

Regular expression visualization

Debuggex Demo

答案 3 :(得分:0)

如果您的引擎支持它,您可以利用正则表达式递归(通常与PCRE兼容)Demo here

此正则表达式适用于任意数量的子域,并允许您捕获内部域。

(([\w-]+)[.](\w{2,}$|(?1)))详细信息:

  • (([\w-]+)[.]启动整个捕获的递归,然后开始捕获最左边的子域,后跟一个点。
  • (\w{2,}$|(?1)))轮替,尝试匹配tdl(匹配结束)或重复模式。

您拥有第二个捕获组中的主机及其在第三个捕获组中的域。以及第一个捕获组中的整个匹配(请参阅演示中的替换窗格)