38

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

function validate_alphanumeric_underscore($str) 
{
    return preg_match('/^\w+$/',$str);
}

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

4

6 回答 6

73

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

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

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

/^[A-Za-z0-9_]+$/

这仅允许字母数字字符和下划线。

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

/^[A-Za-z][A-Za-z0-9]*(?:_[A-Za-z0-9]+)*$/
于 2009-08-25T20:16:15.530 回答
20

这是一个自定义函数,通过使用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;
  }
}

?>
于 2012-11-28T08:45:42.957 回答
10

尝试

function validate_alphanumeric_underscore($str) 
{
    return preg_match('/^[a-zA-Z0-9_]+$/',$str);
}
于 2009-08-25T20:16:37.777 回答
3

在我看来很好。请注意,您对下划线的位置没有任何要求,因此“username_”和“___username”都会通过。

于 2009-08-25T20:17:54.560 回答
1

我会采用gumbo的辅助正则表达式,只允许下划线作为连接,但在_之后添加一个+,这样用户就可以像“special__username”一样,只是一个小的调整。

/^[A-Za-z][A-Za-z0-9]*(?:_+[A-Za-z0-9]+)*$/

于 2013-01-14T16:44:25.003 回答
0

您自己的解决方案非常好。

preg_match使用类似 Perl 的正则表达式,其中\w定义的字符类与您需要的完全匹配:

\w- 匹配“单词”字符(字母数字加“_”)

来源

于 2009-08-25T20:26:33.450 回答