所以我花了最后一个小时左右尝试构建遵循这些规则的正则表达式模式:
这是代码:
preg_match("/^(?!.*__.*)(?!.*\s\s.*)[A-Za-z][A-Za-z0-9_\s]{3,15}[A-Za-z]$/",$n_username)
但出于某种原因"管理员"无效,然而" administrator1"是有效的
有人可以指出我哪里出错吗?
答案 0 :(得分:0)
它适用于Regex101,即使它效率低,技术上也会匹配5-17个字符。我为你清理了表达式:
^(?=[a-z])(?:\w|\s(?!\s)|_(?!_)){3,15}(?<=[a-z])$
Demo (需要i
修饰符或将[a-z]
更改为[a-zA-Z]
)
尽管如此,您很可能遇到preg_match()
如何运作的问题。对我们来说重要的部分是它返回匹配数的整数。我们可以将它与条件语句中的布尔值松散匹配,以查看是否存在成功匹配:
if(preg_match('/^(?=[a-z])(?:\w|\s(?!\s)|_(?!_)){3,15}(?<=[a-z])$/i', $n_username)) {
// match found
} else {
// invalid username
}
<强>解释强>
^(?=[a-z]) (?# anchor to the beginning of string and lookahead for a letter)
(?: (?# begin non-capturing group for repetition)
\w (?# word character, [a-zA-Z0-9_])
| (?# OR)
\s(?!\s) (?# whitespace character, [ \t\r\n\f], not followed by whitespace)
| (?# OR)
_(?!_) (?# _ not followed by a _)
){3,15} (?# repeat the above group 3-15 times)
(?<=[a-z])$ (?# anchor to the end of string and lookbehind for a letter)
答案 1 :(得分:0)
第一部分是负正则表达式(连续空格或_)
(?!.*([\s_]{2,}).*)
第二部分是经典正则表达式(警告如果你想要一个字母开头和结尾,你中间只能有一个字母)
^[A-Za-z][A-Za-z_\s]{1,13}[A-Za-z]$
所以我们有
$regex= "(?!.*([\s_]{2,}).*)^[A-Za-z][A-Za-z_\s]{1,13}[A-Za-z]$";
答案 2 :(得分:0)
上面有人评论过只是对约束进行手动检查。我只是想展示一下这会是什么样子,而不是暗示这是在与正则表达式匹配时实现的。
function isValidInput($string){
$length = strlen($string);
if ($length < 3 || $length > 15) return false;
if (!ctype_alpha(substr($string, 0, 1)) || !ctype_alpha(substr($string, $length-1, 1))) return false;
if (strpos($string, ' ') || strpos($string, '__')) return false;
return true;
}