PHP正则表达式允许最多1'。'或字符串中的'_'字符和'。'或'_'不能在字符串的开头或结尾

时间:2011-07-04 02:12:43

标签: php regex pcre expression

我正在为用户注册表单编写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;
}

感谢您提供任何帮助。

3 个答案:

答案 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;
}

注意:无需转义字符类中的点。