使用正则表达式在用户名字段中允许“数字,字母和3个空格”

时间:2011-08-25 04:10:33

标签: php regex

允许字母,数字和空格(最多3个空格)。我怎么能用正则表达式来做呢?

我将在PHP中使用正则表达式。

if(eregi("...HERE...", $_POST['txt_username']))
{
   //do something
}

4 个答案:

答案 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
*/

see it here on tehplayground.com