我正在开发一个symfony(2.8)项目。注册表中的哪些地方需要一些输入验证。 我需要在子域名输入字段上设置以下约束: 1.应仅包含字母数字字符 2.第一个字符不能是数字 3.没有空格
我正在使用注释来执行此任务。 这是我正在使用的Assert语句:
@Assert\Regex(pattern="/^[a-zA-Z][a-zA-Z0-9]\s+$/", message="Subdomain name must start with a letter and can only have alphanumeric characters with no spaces", groups={"registration"})
当我输入任何简单的单词串时,例如。 svits,它仍然显示错误消息“子域名必须以字母开头,并且只能包含没有空格的字母数字字符” 任何建议将不胜感激。
答案 0 :(得分:2)
您与正则表达式非常接近,只需添加量词并删除\s
:
/^[a-zA-Z][a-zA-Z0-9]+$/
答案 1 :(得分:2)
您的模式不起作用,因为:
[a-zA-Z0-9]
仅匹配1个字母数字字符。要匹配0或更多,请添加*
量词(*量化子模式的零次或多次出现)或+
(如Toto的回答中所示)以匹配一次或多次出现(仅匹配2个+字母)。
由于您的第三个要求是禁止在输入字符串中使用空格,因此请从模式中删除\s+
,因为它需要在字符串末尾添加1个或多个空白符号。
所以,我的建议是
pattern="/^[a-zA-Z][a-zA-Z0-9]*$/"
^
将1个以上的字母单词作为以字母开头的完整字符串匹配,并且可以跟随0 +任何字母数字符号。
要在字符串的任何位置允许空格,但在开头,将\s
放入第二个[...]
(字符类):
pattern="/^[a-zA-Z][a-zA-Z0-9\s]*$/"
^^ ^
如果你不想在结尾允许超过1个空格(没有2个连续的空格),请使用
pattern="/^[a-zA-Z][a-zA-Z0-9]*(?:\s[a-zA-Z0-9]+)*$/"
^^^^^^^^^^^^^^^^^^^
(?:\s[a-zA-Z0-9]+)*
将匹配单个空格的0+序列,然后是1 +个字母数字。