将用户名验证为带下划线的字母数字

35 php regex preg-match

在我的注册页面上,我需要仅将用户名验证为字母数字,还要使用可选的下划线.我想出来了:

function validate_alphanumeric_underscore($str) 
{
    return preg_match('/^\w+$/',$str);
}
Run Code Online (Sandbox Code Playgroud)

这似乎工作正常,但我不是一个正则表达式的专家!有没有人发现任何问题?

Gum*_*mbo 69

实际匹配的字符\w取决于正在使用的语言环境:

"单词"字符是任何字母或数字或下划线字符,即任何可以成为Perl" 单词 " 一部分的字符.字母和数字的定义由PCRE的字符表控制,如果发生特定于语言环境的匹配,则可能会有所不同.例如,在"fr"(法语)语言环境中,一些大于128的字符代码用于重音字母,并且这些字符代码由\ w匹配.

因此,您应该更明确地指定要允许的字符:

/^[A-Za-z0-9_]+$/
Run Code Online (Sandbox Code Playgroud)

这允许只使用字母数字字符和下划线.

如果你想只允许下划线作为连接字符,并想强制用户名必须以字母字符开头:

/^[A-Za-z][A-Za-z0-9]*(?:_[A-Za-z0-9]+)*$/
Run Code Online (Sandbox Code Playgroud)

  • 实际上,\ w是字母数字字符,并根据活动区域设置下划线,因此根据具体情况,它可能匹配"ü"或"ö"等字符. (11认同)
  • @Mahdi这不是必需的,因为字符串必须以`[A-Za-z]`(单字符)或`[A-Za-z0-9]`结尾(来自`[A-Za-z0-9]*`或者,当包含`_`时,来自`[A-Za-z0-9] +`).与此相反,您的模式将允许除"_"之外的任何最后一个字符. (3认同)

小智 17

这是一个自定义函数,通过使用PHP ctype_alnum和一系列允许的字符来验证字符串:

<?php

$str = "";
function validate_username($str) {

  // each array entry is an special char allowed
  // besides the ones from ctype_alnum
  $allowed = array(".", "-", "_");

  if ( ctype_alnum( str_replace($allowed, '', $str ) ) ) {
    return $str;
  } else {
    $str = "Invalid Username";
    return $str;
  }
}

?>
Run Code Online (Sandbox Code Playgroud)

  • 一般来说,我喜欢尽可能避免使用正则表达式.对于这种验证,这似乎不易出错并且更容易理解(开发人员只需要知道php,不需要知道正则表达式语法).该解决方案是PHP独有的,但这正是我正在寻找的.谢谢. (4认同)

Phi*_*ord 10

尝试

function validate_alphanumeric_underscore($str) 
{
    return preg_match('/^[a-zA-Z0-9_]+$/',$str);
}
Run Code Online (Sandbox Code Playgroud)