使用正则表达式输入字段验证约束

时间:2016-06-02 08:37:16

标签: php regex validation symfony annotations

我正在开发一个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,它仍然显示错误消息“子域名必须以字母开头,并且只能包含没有空格的字母数字字符” 任何建议将不胜感激。

2 个答案:

答案 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 +个字母数字。