Php 预匹配不是';行不通
我有一个PHP preg_match代码,假设它只允许a-z(大写和小写)0-9和下划线 但当我尝试使用用户名“Rizon”注册时,它会说: 只允许使用有效字符 代码如下: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”之类的用户名以及带
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、路径、方程式等时会引起问题。