我正在使用http://bootstrapvalidator.com/validators/regexp/,我想验证一个名字(不是一个人)。名称必须仅包含字母,数字和一个或多个单个空格(不在开头或结尾)。最小长度为3个字符。我有这个正则表达式:
^[^\s][a-zA-Z0-9\s!]{3,}[^\s]$
我的PHP代码:
echo "<input class='form-control' type='text' name='fullname'";
echo "required";
echo "data-bv-regexp='true'";
echo "data-bv-regexp-regexp='^[^\s][a-zA-Z0-9\s!]{3,}[^\s]$'";
echo "data-bv-regexp-message='Your current input is not valid' />";
我的文字示例(下划线是空格):
Name
应该验证确定。
My___Name
应该失败。
_My_Name_
应该失败。
My_Name_Is_OK
应该验证确定。
我的问题:
1)如何避免文本中间的双/多空格?
2)为什么我需要键入5个字符才能验证确定?我当然可以将其更改为{1}
,然后它将验证确定,但这对我来说是不合逻辑的(如果我只想要1个字符验证确定怎么办?)
答案 0 :(得分:2)
您可能不希望在正则表达式的开头/结尾使用[^\s]
因为它匹配任何非空白字符,而不仅仅是[a-zA-Z0-9]
(为什么顺便说一句,你的角色类中是否有!
?)。注意:\S
相当于[^\s]
。
我还怀疑你不想允许制表符,换行符,换页符和其他空格字符(\s
包含),所以请改用空格字符。
然后,您的正则表达式目前至少需要5个字符,而不是3个字符 - [^\s]
匹配一个,[a-zA-Z0-9\s!]{3,}
匹配三个或更多,[^\s]
匹配一个。
为避免双倍空格,您可以使用negative lookahead assertion:
^(?!.* {2})[a-zA-Z0-9][a-zA-Z0-9 ]+[a-zA-Z0-9]$
应该做你需要的。
<强>解释强>
^ # Start of string
(?!.*[ ]{2}) # Assert that there are no two consecutive spaces
[a-zA-Z0-9] # Match one alphanumeric character
[a-zA-Z0-9 ]+ # Match one or more alphanumeric characters or spaces
[a-zA-Z0-9] # Match one alphanumeric character
$ # End of string