Регулярное выражение для действительного субдомена в Ruby - PullRequest
10 голосов
/ 04 марта 2011

Я пытаюсь проверить строку ввода пользователя, которая будет использоваться как поддомен. Правила следующие:

  1. Длина от 1 до 63 символов (я беру 63 из числа символов, которые Google Chrome разрешает в поддомене, но не уверен, что это на самом деле директива сервера. Если у вас есть лучший совет относительно допустимой максимальной длины, я интересно услышать это)
  2. Может содержать a-zA-Z0-9, дефис, подчеркивание
  3. Не может начинаться или заканчиваться дефисом или подчеркиванием

РЕДАКТИРОВАТЬ: Из ввода ниже, я добавил следующее: 4. Не должно содержать последовательных дефисов или подчеркиваний.

Примеры:

a => valid
0 => valid
- => not valid
_ => not valid
a- => not valid
-a => not valid
a_ => not valid
_a => not valid
aa => valid
aaa => valid
a-a-a => valid
0-a => valid
a&a => not valid
a-_0 => not valid
a--a => not valid
aaa- => not valid

Моя проблема в том, что я не уверен, как указать с помощью RegEx, что строке разрешено быть только одним символом, а также указать, что она не может начинаться или заканчиваться дефисом или подчеркиванием.

Спасибо!

Ответы [ 5 ]

18 голосов
/ 04 марта 2011

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

/^[a-z\d]+(-[a-z\d]+)*$/i

С учетом вышеизложенного вы не получите последовательных - символов, например, a-bbb-ccc пропусков иa--d терпит неудачу.

/^[a-z\d]+([-_][a-z\d]+)*$/i

Допустят также непоследовательные подчеркивания.


Обновление: вы обнаружите, что на практике подчеркиванияне допускаются, и все поддомены должны начинаться с буквы.Приведенное выше решение не допускает интернационализированных поддоменов (punycode).Вам лучше использовать это

/\A([a-z][a-z\d]*(-[a-z\d]+)*|xn--[\-a-z\d]+)\z/i
0 голосов
/ 27 января 2013

^ [A-Za-Z] ([- A-Za-Z \ d] * [A-Za-Z \ d])? $

Это просто обеспечивает соблюдение стандарта эффективным способом без возврата. Он не проверяет длину, но Regex неэффективен в таких вещах. Просто проверьте длину строки (от 1 до 64 символов).

0 голосов
/ 04 марта 2011

Я не знаком с синтаксисом регулярных выражений Ruby, но я предполагаю, что это похоже, скажем, на Perl. Звучит так, как вы хотите:

/^(?![-_])[-a-z\d_]{1,63}(?<![-_])$/i

Или, если Ruby не использует флаг i, просто замените [-a-z\d_] на [-a-zA-Z\d_].

Причина, по которой я использую [-a-zA-Z\d_] вместо более короткого [-\w], заключается в том, что, хотя он почти эквивалентен, \w допускает использование специальных символов, таких как ä , а не только символы типа ASCII. Такое поведение может быть дополнительно отключено в большинстве языков, или вы можете разрешить его, если хотите.

Дополнительная информация о классах символов , квантификаторах и lookarounds

0 голосов
/ 04 марта 2011
/^([a-z0-9][a-z0-9\-\_]{0,61}[a-z0-9]|[a-z0-9])$/i

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

/^([a-z0-9]([_\-](?![_\-])|[a-z0-9]){0,61}[a-z0-9]|[a-z0-9])$/i

Средняячасть использует обходной путь, чтобы проверить это.

0 голосов
/ 04 марта 2011

/[^\W\_](.+?)[^\W\_]$/i должно работать для вас (попробуйте наш http://rubular.com/ для проверки регулярных выражений)

РЕДАКТИРОВАТЬ: на самом деле, это не проверяет одну / две буквы / цифры.вместо этого попробуйте /([^\W\_](.+?)[^\W\_])|([a-z0-9]{1,2})/i и возитесь с ним в рублевом выражении, пока не получите именно то, что вам нужно (если это уже не заботится об этом).

...