Регулярное выражение PHP, допускающее не более 1 '.' или символ «_» в строке и «.» или '_' не может быть в начале или конце строки - PullRequest
2 голосов
/ 04 июля 2011

Я пишу проверку PHP для формы регистрации пользователя.У меня есть функция, настроенная для проверки имени пользователя, которое использует Perl-совместимые регулярные выражения.Как я могу отредактировать его так, чтобы одно из требований регулярного выражения было НАИБОЛЕЕ единым.или символ _, но НЕ разрешать этот символ в начале или конце строки?Так, например, такие вещи, как «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;
}

Спасибо за любую помощь, которую вы можете принести.

Ответы [ 3 ]

6 голосов
/ 04 июля 2011
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;
}

Вы, вероятно, могли бы сделать все, используя только одно регулярное выражение, но это будет намного сложнее читать.

0 голосов
/ 05 июля 2011

Вот прокомментированное, проверенное регулярное выражение, которое обеспечивает дополнительное (неуказанное, но подразумеваемое) требование к длине от 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;
}

Примечание: не нужно экранировать точку внутри класса символов.

0 голосов
/ 04 июля 2011

Вы можете использовать следующий шаблон, я разделил его на несколько строк, чтобы сделать его более понятным:

$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;
}
...