Php 预匹配不是';行不通

Php 预匹配不是';行不通,php,regex,preg-match,Php,Regex,Preg Match,我有一个PHP preg_match代码,假设它只允许a-z(大写和小写)0-9和下划线 但当我尝试使用用户名“Rizon”注册时,它会说: 只允许使用有效字符 代码如下: if (!preg_match("[a-zA-Z0-9]_",$_POST['username'])) { $_SESSION['error']['username'] = "Only valid characters are allowed."; } 如何修复preg_匹配,使其允许诸如“Rizon”之类的用户名以及带

我有一个PHP preg_match代码,假设它只允许a-z(大写和小写)0-9和下划线

但当我尝试使用用户名“Rizon”注册时,它会说: 只允许使用有效字符

代码如下:

if (!preg_match("[a-zA-Z0-9]_",$_POST['username'])) {
$_SESSION['error']['username'] = "Only valid characters are allowed."; 
}
如何修复preg_匹配,使其允许诸如“Rizon”之类的用户名以及带有大写和/或小写字母和/或数字和/或下划线的用户名?

试试这个

!preg_match("/[a-zA-Z0-9_]+/",$_POST['username']);

试试这个

!preg_match("/[a-zA-Z0-9_]+/",$_POST['username']);


首先,正则表达式缺少分隔符。您可以使用
/
#
或任何其他。
接下来,通过再次声明要匹配的模式,它将转换为“匹配后跟下划线的单个字母数字符号”。
因此,正如已经建议使用的那样

[a-zA-Z0-9_]+
改为使用正则表达式,并使用模式分隔符

preg_match('/[a-zA-Z0-9_]+/',$_POST['username'])
您也可以使用
i
来区分大小写

preg_match('/[a-z0-9_]+/i',$_POST['username'])

首先,正则表达式缺少分隔符。您可以使用
/
#
或任何其他。
接下来,通过再次声明要匹配的模式,它将转换为“匹配后跟下划线的单个字母数字符号”。
因此,正如已经建议使用的那样

[a-zA-Z0-9_]+
改为使用正则表达式,并使用模式分隔符

preg_match('/[a-zA-Z0-9_]+/',$_POST['username'])
您也可以使用
i
来区分大小写

preg_match('/[a-z0-9_]+/i',$_POST['username'])
这应该可以做到(您还需要检查用户名是否仅包含您的模式)

在不添加
^
(开始匹配)和
$
(结束匹配)的情况下,正则表达式将仅验证是否包含模式。

这应该可以解决问题(您还需要检查用户名是否仅包含模式)


如果不添加
^
(开始匹配)和
$
(结束匹配),正则表达式将仅在包含模式时进行验证。

我认为这是最简单的正则表达式

if (!preg_match("~^\w+$~",$_POST['username'])) {
     $_SESSION['error']['username'] = "Only valid characters are allowed."; 
}
演示:

\w
是任意字符a-z、a-z、0-9和下划线<代码>+是一个或多个字符

^
是字符串的开头,
$
是字符串的结尾。检查regex101链接以了解测试和更详细的说明

链接:




我认为这将是最简单的正则表达式

if (!preg_match("~^\w+$~",$_POST['username'])) {
     $_SESSION['error']['username'] = "Only valid characters are allowed."; 
}
演示:

\w
是任意字符a-z、a-z、0-9和下划线<代码>+是一个或多个字符

^
是字符串的开头,
$
是字符串的结尾。检查regex101链接以了解测试和更详细的说明

链接:




想想你可能想做的事情:

if (preg_match("/\W/",$_POST['username'])) { // check for non-word chars
  $_SESSION['error']['username'] = "Only valid characters are allowed."; 
}
以及长度的单独验证:

if (!preg_match("/^.{6,8}$/",$_POST['username'])) { // check for length
  $_SESSION['error']['username'] = "6 to 8 letters please"; 
}

想想你可能想做的事情:

if (preg_match("/\W/",$_POST['username'])) { // check for non-word chars
  $_SESSION['error']['username'] = "Only valid characters are allowed."; 
}
以及长度的单独验证:

if (!preg_match("/^.{6,8}$/",$_POST['username'])) { // check for length
  $_SESSION['error']['username'] = "6 to 8 letters please"; 
}

您没有分隔符。您没有分隔符。或者使用不区分大小写的标志,您可以使用
/[a-z0-9\]+/i
,或者如果希望它们以字母开头,长度至少为3个字符,而不是以下划线结尾:'/^[a-zA-Z][a-zA-z0-9\]+[a-zA-z0-9]$/,或者使用不区分大小写的标志,您可以使用
/[a-z0-9\+/i
,或者如果希望它们以字母开头,长度至少为3个字符,不要以下划线结尾:'/^[a-zA-Z][a-zA-Z0-9.]+[a-zA-Z0-9]$/'\w还可以允许使用特定于区域设置的字符。这可能是最好的答案,但我不会投票选择以
~
作为分隔符的正则表达式。@pguardiario作为分隔符有什么问题?@pguardiario在外观或编码实践中?我从未遇到过使用
~
作为分隔符的问题。但是,
/
在处理URL、路径、方程式时会引起问题,等等。\w还可以允许使用特定于区域设置的字符。这可能是最好的答案,但我不会对使用
~
作为分隔符的正则表达式进行升级。@pguardiario使用
~
作为分隔符有什么问题?@pguardiario在外观或编码实践中有什么问题?我从未遇到过使用
~
作为分隔符的问题。但是
/
在处理URL、路径、方程式等时会引起问题。