以下正则表达式会选择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
答案 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";
}
?>
答案 2 :(得分:2)
首先,以下是如何匹配一个域(给出您的示例):
((?:[a-zA-Z0-9-]+\.)+[a-zA-Z0-9-]{2,})$
tld匹配:
[a-zA-Z0-9]+(?:-[a-zA-Z0-9]+)*
现在,您可以将多个域用点分隔,然后是tld:
[a-z]{2,}
如果您需要匹配由至少2个子域+ tld组成的域:
((?:[a-zA-Z0-9]+(?:-[a-zA-Z0-9]+)*\.)+[a-z]{2,})
答案 3 :(得分:0)
如果您的引擎支持它,您可以利用正则表达式递归(通常与PCRE兼容)Demo here
此正则表达式适用于任意数量的子域,并允许您捕获内部域。
(([\w-]+)[.](\w{2,}$|(?1)))
详细信息:
(([\w-]+)[.]
启动整个捕获的递归,然后开始捕获最左边的子域,后跟一个点。(\w{2,}$|(?1)))
轮替,尝试匹配tdl(匹配结束)或重复模式。您拥有第二个捕获组中的主机及其在第三个捕获组中的域。以及第一个捕获组中的整个匹配(请参阅演示中的替换窗格)