我有一个webapp,人们在这个应用程序域(xx.app.com)下注册并获得一个子域...对于每个子域,有一个以语法方式附加到其上的数据库,其名称与子域。
我需要的是正确的正则表达式,它适用于子域,当然还有一个数据库名称(mysql,如果它很重要),它应该是小写的& 6到20之间的长度和唯一允许的字符是“ - ”,数字也被禁止...
我尝试了很多次,但总是很糟糕,有些像:/([a-z - ]){6,20} /
提前致谢:)
答案 0 :(得分:2)
可能有一个正确的正则表达式,但正则表达式不适合这个。
编辑:
我不确定你是如何使用它的。如果您只处理子域部分,则以下内容应该起作用而不匹配数字:
^[a-z-]{6,20}$
这可确保子域仅 a到z和 - 并且在6到20倍之间。 ^匹配字符串的开头,$匹配结束。
之前的正则表达式接受数字或其他任何东西的原因是因为匹配本身就是字符串的一部分。现在使用^
和$
确保它是整个字符串。
答案 1 :(得分:1)
这将是一个更安全的正则表达式,因为子域名不能以连字符开头:
^[a-z][a-z-]{5,19}$
至于数据库名称我认为它不能包含连字符,因为它是减法运算符,所以你最好的选择可能是禁止超量或用下划线替换它们:
$database = str_replace('-', '_', $subdomain);
编辑:显然@nikic是对的,只要您反复使用数据库名称,就可以使用连字符。
答案 2 :(得分:0)
你有没有试过逃脱连字符?
/([a-z\-]){6,20}/
答案 3 :(得分:0)
您需要positive lookahead regex。请尝试以下代码:
<?php
$a = array("xx-yyy.domain.cam", "xx4yyy.domain.cam", "abcde.domain.com", "my-sub-domain.domain.org");
foreach ($a as $v) {
echo "For domain $v: ";
preg_match('/^(?:[-a-z]{6,20})(?=\.)/', $v, $m );
if (count($m) > 0)
echo( "subdomain: " . $m[0] . "\n");
else
echo "subdomain not matched\n";
}
?>
在出现第一个点-
字符之前,基本上匹配小写字母和连字符.
字符,长度为6到20个字符。
-
连字符,则无需转义。
For domain xx-yyy.domain.cam: subdomain: xx-yyy
For domain xx4yyy.domain.cam: subdomain not matched
For domain abcde.domain.com: subdomain not matched
For domain my-sub-domain.domain.org: subdomain: my-sub-domain