我正在为用户注册表单编写PHP验证。我有一个函数设置来验证使用perl兼容的正则表达式的用户名。我如何编辑它,以便正则表达式的一个要求是AT MOST一个。或_字符,但不允许字符串开头或结尾的字符?例如,“abc.d”,“nicholas_smith”和“20z.e”之类的东西都是有效的,但是像“abcd。”,“a_b.C”和“_nicholassmith”这样的东西都是无效的。< / p>
这是我目前所拥有的,但它没有添加要求。和_字符。
function isUsernameValid()
{
if(preg_match("/^[A-Za-z0-9_\.]*(?=.{5,20}).*$/", $this->username))
{
return true; //Username is valid format
}
return false;
}
感谢您提供任何帮助。
答案 0 :(得分:6)
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;
}
你可能只使用一个正则表达式完成所有操作,但它会更难阅读。
答案 1 :(得分:0)
您可以使用以下模式,我将其分为多行以使其更易理解:
$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;
}
答案 2 :(得分:0)
这是一个经过评论,经过测试的正则表达式,它强制执行额外的(未指定但隐含的)长度要求,最长为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;
}
注意:无需转义字符类中的点。