Ruby中有效子域的正则表达式

gsr*_*gsr 10 ruby regex subdomain ruby-on-rails ruby-on-rails-3

我正在尝试验证将用作子域的用户输入字符串.规则如下:

  1. 长度在1到63个字符之间(我从谷歌浏览器在子域中显示的字符数量中选择63个,不确定它是否实际上是服务器指令.如果您对有效最大长度有更好的建议,我有兴趣听到它)
  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
Run Code Online (Sandbox Code Playgroud)

我的问题是我不知道如何用RegEx指定字符串只允许一个字符,同时还指定它不能以连字符或下划线开头或结尾.

谢谢!

Wal*_*alf 18

不能 可以有下划线 正确子域名,但你需要它们吗?在trim输入之后,进行简单的字符串长度检查,然后使用以下方法进行测试:

/^[a-z\d]+(-[a-z\d]+)*$/i
Run Code Online (Sandbox Code Playgroud)

有了上述内容,您将无法获得连续的-字符,例如a-bbb-ccc传递和a--d失败.

/^[a-z\d]+([-_][a-z\d]+)*$/i
Run Code Online (Sandbox Code Playgroud)

也将允许非连续的下划线.


更新:您会发现,在实践中,不允许使用下划线,并且所有子域必须以字母开头.上述解决方案不允许国际化子域(punycode).你最好使用它

/\A([a-z][a-z\d]*(-[a-z\d]+)*|xn--[\-a-z\d]+)\z/i
Run Code Online (Sandbox Code Playgroud)