Я собираюсь проверить имя пользователя через JavaScript, а затем PHP.
Имя пользователя может содержать английские буквы, цифры и один дефис (-).
Имя пользователя не может быть запущено с дефиса (-).
Имя пользователя не может быть заполнено дефис (-).
Имя пользователя не может быть запущено с номерами.
Имя пользователя не может содержать более одного дефиса (-).
Имя пользователя не может быть меньше 6 и длиннее 20.
abc123 is correct.
abc-123 is correct.
ab12 is wrong: username is shorter than 6 character.
-abc123 is wrong: username is started with hyphen.
abc123- is wrong: username is finished with hyphen.
ab-12-c3 is wrong: username contains more than one hyphen.
123abc is wrong: username is started with numbers.
Вы можете использовать
^(?!\d)(?!.*-.*-)(?!.*-$)(?!-)[a-zA-Z0-9-]{6,20}$
См. Демонстрацию
Объяснение:
^
- Матч в начале(?!\d)
- Не совпадают, если строка начинается с цифры(?!.*-.*-)
- Не совпадают, если строка содержит 2 дефиса в строке(?!.*-$)
- Не совпадают, если строка заканчивается дефисом(?!-)
- Не совпадают, если строка начинается с дефиса[a-zA-Z0-9-]{6,20}
- соответствует [a-zA-Z0-9-]{6,20}
символам из указанного диапазона$
- Установить конец строки.Вам нужно использовать регулярное выражение на основе lookahead:
/^(?=.{6,20}$)[a-z][a-z0-9]+(?:-[a-z0-9]+)?$/i
Логическим подходом с использованием JavaScript будет:
function _isvalid(str) {
var re = /^[a-z][a-z0-9]+(?:-[a-z0-9]+)?$/i
return ((str.length > 5) && (str.length < 21) && re.test(str))
}