Регулярное выражение для фильтрации нежелательных имен пользователей - PullRequest
0 голосов
/ 18 августа 2010

На сайте, над которым я работаю, есть требование, чтобы имена пользователей не начинались с <alpha><alpha>_

Так что это не должно быть разрешено:

  • SU_Coolguy
  • MR_Nobody
  • my_Pony

Но с этим все должно быть в порядке:

  • __ SU_Coolguy
  • MRS_Nobody
  • YourPony

В рамках, который я использую, я могу проверять только на соответствие регулярному выражению, но не на соответствие. До сих пор я придумал это:

"/^([^A-Za-z0-9]{2}\_|[A-Za-z0-9]{3,27})/"

Это работает для большинства элементов, но не работает на "__SU_Coolguy".

Любая помощь в этом регулярном выражении будет принята с благодарностью. :)

Ответы [ 4 ]

3 голосов
/ 18 августа 2010

Используется отрицательный прогноз :

^(?![A-Za-z]{2}_)[A-Za-z0-9_]{3,27}$

Давайте разберемся:

Assert position at the beginning of a line (at beginning of the string or after a line break character) «^»
Assert that it is impossible to match the regex below starting at this position (negative lookahead) «(?![A-Za-z]{2}_)»
   Match a single character present in the list below «[A-Za-z]{2}»
      Exactly 2 times «{2}»
      A character in the range between “A” and “Z” «A-Z»
      A character in the range between “a” and “z” «a-z»
   Match the character “_” literally «_»
Match a single character present in the list below «[A-Za-z0-9_]{3,27}»
   Between 3 and 27 times, as many times as possible, giving back as needed (greedy) «{3,27}»
   A character in the range between “A” and “Z” «A-Z»
   A character in the range between “a” and “z” «a-z»
   A character in the range between “0” and “9” «0-9»
   The character “_” «_»
Assert position at the end of a line (at the end of the string or before a line break character) «$»
2 голосов
/ 18 августа 2010

Ваше регулярное выражение будет /^(?![a-zA-Z0-9]{2}_)/. Это означает «начать с , а не {два буквенно-цифровых символа и знак подчеркивания}».

1 голос
/ 18 августа 2010

Просто вставьте отрицательное утверждение, как это:

/^([^A-Za-z0-9]{2}(?!\_)|[A-Za-z0-9]{3,27})/
                   ^^--Notice the assertion.

Вот полный тестовый пример:

<?php
$names = array('SU_Coolguy','MR_Nobody','my_Pony','__SU_Coolguy','MRS_Nobody','YourPony');

foreach($names as $name){
        echo "$name => ";
        if(preg_match('/^([^A-Za-z0-9]{2}(?!\_)|[A-Za-z0-9]{3,27})/',$name)) {
                echo 'ok';
        }else{
                echo 'fail';
        }
        echo "\n";
}
?>

, который выводит это:

SU_Coolguy => fail
MR_Nobody => fail
my_Pony => fail
__SU_Coolguy => ok
MRS_Nobody => ok
YourPony => ok
0 голосов
/ 18 августа 2010

Простой способ в этом случае - просто разбить его на случаи: имя пользователя либо начинается с не альфа, либо с альфы и без альфа, либо с двумя альфа и без подчеркивания, примерно так:

/^([^A-Za-z]|[A-Za-z][^A-Za-z]|[A-Za-z][A-Za-z][^_])/
...