preg_match的正则表达式如何检查包含字母数字、点、破折号和下划线的字符串?

3

我正在检查用户输入的用户名

我在使用 preg_match() 在 PHP 中验证用户名,但是似乎无法按照我的意愿工作。我要求 preg_match() 实现以下功能:

  • 仅接受字母、数字和 . - _

即仅允许使用字母数字、点、破折号和下划线,我尝试了 htaccess 中的正则表达式,它看起来像这样

([A-Za-z0-9.-_]+)

像这样但似乎不起作用,对于简单的字母用户名它会返回false。
$text = 'username';

if (preg_match('/^[A-Za-z0-9.-_]$/' , $text)) {
   echo 'true';   
} else {
   echo 'false';
}

我该如何让它工作?

我将在函数中使用它,像这样:

//check if username is valid
function isValidUsername($str) {
    return preg_match('/[^A-Za-z0-9.-_]/', $str);
}

我尝试在preg_match()和用户名中回答,但正则表达式仍然存在问题。


更新

我正在使用xdazz提供的代码,在函数内部这样使用。

//check if username is valid
function isValidUsername($str) {
    if (preg_match('/^[A-Za-z0-9._-]+$/' , $str)) {
       return true;   
    } else {
       return false;
    }
}

并且像这样检查它。
$text = 'username._-546_546AAA';


if (isValidUsername($text) === true) {
echo 'good';
}
else{
echo 'bad';
}

1
如果(preg_match('/^[A-Za-z0-9.-_]$/' , $text))则需要一个+或*,否则它将匹配单个字符。 - vks
4个回答

2
你错过了++表示一个或多个,*表示零个或多个),或者你的正则表达式只能匹配一个字符的字符串。
if (preg_match('/^[A-Za-z0-9._-]+$/' , $text)) {
   echo 'true';   
} else {
   echo 'false';
}

谢谢,这个按预期工作了。我尝试转义了,像这样 -,但它没有起作用。 - user1642018

2

-[...]中具有特殊意义,用于表示范围。

它应该在开头或结尾处使用,或像([A-Za-z0-9._-]+)这样进行转义,否则它将匹配ASCII字符集中._之间的所有字符。

阅读类似的帖子Including a hyphen in a regex character bracket?

最好使用\w来匹配[A-Za-z0-9_]。更简短的形式是 [\w.-]+


你最后一个正则表达式模式的含义是什么?

这里使用[^..]表示否定字符集。如果在^[...]之外使用它,则代表行/字符串的开头。

[^A-Za-z0-9.-_]          any character except: 
                         'A' to 'Z', 
                         'a' to 'z', 
                         '0' to '9',
                         '.' to '_'

[\w.-]+ 看起来不错,试一下。 - user1642018
1
我认为不会有任何显著的性能提升。阅读《正则表达式性能优化技巧》(https://dev59.com/gXM_5IYBdhLWcg3wvFzJ)。 - Braj
感谢指出。[]内的.-_将匹配字符表中46-95的字符。我在我的正则表达式中也遇到了同样的错误。在末尾加上-解决了这个问题。我相信用\-转义也可以解决这个问题。 - LeOn - Han Li

1

只需在字符类的末尾加上-,并在字符类后添加+以匹配一个或多个字符。

$text = 'username';

if (preg_match('/^[A-Za-z0-9._-]+$/' , $text)) {
   echo 'true';   
} else {
   echo 'false';
}

1
功能应该是这样的。
function isValidUsername($str) {
    return preg_match("/^[A-Za-z0-9._-]+$/", $str);
}

我认为应该在斜杠后面加上^符号。 - user1642018
方括号内的“and”应位于末尾。 - user1642018
如果输入是空字符串,它返回true。 - Avinash Raj
@AvinashRaj,那么克服它的方法是什么? - user1642018
1
他现在编辑了答案。*表示零个或多个字符,因此如果输入中没有字符,则返回true,但+表示一个或多个字符。 - Avinash Raj

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接