允许字母,数字和空格(最多3个空格)。我怎么能用正则表达式来做呢?
我将在PHP中使用正则表达式。
if(eregi("...HERE...", $_POST['txt_username']))
{
//do something
}
答案 0 :(得分:4)
这个怎么样?
/^([^\W_]*\s){0,3}[^\W_]*$/
没有灾难性的回溯,因为([^\W_]*\s)
组明确划界。
修改:采用 tchrist 的unicode友好版本:/^([\pN\pL\pM]*\s){0,3}[\pN\pL\pM]*$/
答案 1 :(得分:3)
您可以使用:
if(preg_match('@^(\w*\s){0,3}\w*$@', $_POST['txt_username)) {
// do something
}
请参阅:rubular.com
注意:\w
包含下划线(_
)。如果您不想要它,可以使用:
if(preg_match('@^([^\W_]*\s){0,3}[^\W_]*$@', $_POST['txt_username)) {
// do something
}
相反。
编辑:由于OP决定接受我的回答,我添加了Justin的改进。
答案 2 :(得分:1)
如果您不想连续空格,边缘附近没有空格,可以尝试:
preg_match("#^\w+(?: \w+){0,3}$#", "123 4 5", $matches);
if($matches)
print_r(":-)");
如果您不关心连续的空格,类似的选项是^\w*(?: \w*){0,3}$
或者,更现代的方法,lookahead(适用于添加更多约束):
^(?![^ ]*(?: [^ ]*){4})[\w ]*$
无论哪种方式,请注意\w
包含下划线,您可能希望将其替换为更合适的内容,例如[a-zA-Z\d]
或支持Unicode的[\p{L}\p{N}]
。
答案 3 :(得分:0)
我会做这样的事情:
if( count(explode(' ', $_POST['txt_username'])) <= 5 && preg_match('/^[\w ]+$/', $_POST['txt_username']) ){
// do something
}
你可以使用正则表达式处理这一切,但解决方案会过于复杂。这应该会达到同样的效果。
示例:
// press Ctrl-Enter to execute this code
$names = array(
"hello world", //valid
"hello wo rl d", //valid
"h e l l o w o r l d", //invalid
"hello123@@" //invalid
);
function name_is_valid($name){
return count(explode(' ', $name)) <= 5 && preg_match('/^[\w ]+$/', $name);
}
foreach($names as $n){
echo sprintf("%s is %s\n", $n, name_is_valid($n)?"valid":"invalid");
}
/*
hello world is valid
hello wo rl d is valid
h e l l o w o r l d is invalid
hello123@@ is invalid
*/