Вы можете использовать следующее PCRE регулярное выражение со вкусом:
/^(?!.*\-\-)(?!.*\-.+\-.*\-)(?!-)[a-z0-9-]{0,52}(?<!-)$/gmi
Демо
Регулярное выражение можно сделать самодокументирующим запись в режиме свободного пробега :
/
^ # match beginning of line
(?!.*\-\-.*$) # the line may not contain two consecutive hyphens
(?!.*\-.*\-.*\-.*$) # the line may not contain more than two hyphens
(?!-) # the first char cannot be a hyphen
[a-z0-9-]{0,52} # match 0-52 letters, digits and hyphens
(?<!-) # the last char cannot be a hyphen
$ # match end of the line
/xgmi # free-spacing, global, multiline, case indifferent modes
(?!.*\-\-.*$)
, (?!.*\-.*\-.*\-.*$)
и (?!-)
являются отрицательными взглядами ; (?<!-)
- это негативный вид сзади .
Соответствует каждой строке строки (удобно для демонстрации тестовых примеров в demo ). Если строка содержит одну строку, регулярное выражение может быть несколько упрощено:
\A(?!.*\-\-)(?!.*\-.+\-.*\-)(?!-)[a-z0-9-]{0,52}(?<!-)\z
Не то, чтобы \A
и \z
начинались и заканчивались якорями строки, тогда как ^
и $
начинаются и конец якоря линии. Сравните отрицательные точки зрения в этом регулярном выражении с теми в предыдущем.
Если это имеет значение, это соответствует пустым строкам.