【问题标题】:Preg_match isn't workingPreg_match 不起作用
【发布时间】:2015-07-06 12:46:02
【问题描述】:

我有这个 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_match 以使其允许“Rizon”等用户名以及包含大写和/或小写字母和/或数字和/或下划线的用户名?

【问题讨论】:

标签: php regex preg-match


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    试试这个

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

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

    【讨论】:

    • 或者你可以使用不区分大小写的标志/[a-z0-9_]+/i
    • 或者如果您希望它们以字母开头,至少 3 个字符长,而不是以下划线结尾:'/^[a-zA-Z][a-zA-Z0-9_] +[a-zA-Z0-9]$/'
    【解决方案3】:

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

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

    演示:https://regex101.com/r/rG3sJ3/1

    \w 是任意字符 a-z、A-Z、0-9 和下划线。 + 是一个或多个字符。

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

    链接:

    https://docs.oracle.com/javase/tutorial/essential/regex/pre_char_classes.html
    https://docs.oracle.com/javase/tutorial/essential/regex/quant.html
    https://docs.oracle.com/javase/tutorial/essential/regex/bounds.html

    【讨论】:

    • \w 还可以允许特定区域设置的字符。
    • 这可能是最好的答案,但我不赞成使用 ~ 作为分隔符的正则表达式。
    • @pguardiario ~ 作为分隔符有什么问题?
    • @pguardiario 在外观或编码实践中?我从来没有遇到过使用~ 作为分隔符的问题。 / 在处理 URL、路径、方程式等时会引起问题。
    【解决方案4】:

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

    [a-zA-Z0-9_]+
    

    改为使用正则表达式并使用模式分隔符

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

    您也可以使用modifier i 来区分大小写

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

    【讨论】:

      【解决方案5】:

      想想你可能想做的事:

      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"; 
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-05-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-06-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多