我正在编写一个用户注册表单的PHP验证。我设置了一个函数来验证用户名,该函数使用与perl兼容的正则表达式。如何编辑它才能使正则表达式的一个要求最多只有一个。或_ character,但不允许该字符出现在字符串的开头或结尾?例如,像"abc.d“、"nicholas_smith”和"20z.e“这样的内容是有效的,但是像"abcd.”、"a_b.C“和"_nicholassmith”这样的内容都是无效的。
这是我目前所拥有的,但它没有添加关于的要求。和_字符。
function isUsernameValid()
{
if(preg_match("/^[A-Za-z0-9_\.]*(?=.{5,20}).*$/", $this->username))
{
return true; //Username is valid format
}
return false;
}
感谢您可能带来的任何帮助。
发布于 2011-07-04 10:20:53
if (preg_match("/^[a-zA-Z0-9]+[._]?[a-zA-Z0-9]+$/", $this->username)) {
// there is at most one . or _, and it's not at the beginning or end
}
您可以将其与字符串长度检查结合使用:
function isUsernameValid() {
$length = strlen($this->username);
if (5 <= $length && $length <= 20
&& preg_match("/^[a-zA-Z0-9]+[._]?[a-zA-Z0-9]+$/", $this->username)) {
return true;
}
return false;
}
您可能只使用一个正则表达式就可以完成所有的工作,但是阅读起来会困难得多。
发布于 2011-07-04 10:22:21
您可以使用以下模式,我将其划分为多行,以使其更易于理解:
$pattern = "";
$pattern.= "%"; // Start pattern
$pattern.= "[a-z0-9]+"; // Some alphanumeric chars, at least one.
$pattern.= "[\\._]"; // Contains exactly either one "_" or one "."
$pattern.= "[a-z0-9]+"; // Some alphanumeric chars, at least one.
$pattern.= "%i"; // End pattern, optionally case-insensetive
然后你可以在你的函数/方法中使用这个模式:
function isUsernameValid() {
// $pattern is defined here
return preg_match($pattern, $this->username) > 0;
}
发布于 2011-07-05 11:25:46
下面是一个经过注释和测试的正则表达式,它强制执行最多5到20个字符的额外(未指定但隐含)长度要求:
function isUsernameValid($username) {
if (preg_match('/ # Validate User Registration.
^ # Anchor to start of string.
(?=[a-z0-9]+(?:[._][a-z0-9]+)?\z) # One inner dot or underscore max.
[a-z0-9._]{5,20} # Match from 5 to 20 valid chars.
\z # Anchor to end of string.
/ix', $username)) {
return true;
}
return false;
}
注意:不需要转义character类中的点。
https://stackoverflow.com/questions/6566751
复制相似问题