PHP正则零或多个空白符失效,Symfony表单正则约束方案咨询
Symfony表单正则约束:匹配违规输入的解决方案
针对你的需求,我们可以通过否定前瞻构造一个正则表达式,专门匹配不符合规范的输入内容,这样Symfony的Regex约束就能正确拦截违规值了。
最终正则表达式
^(?!\s*[@#][^,]*(?:,\s*[@#][^,]*)*$).+$
正则逻辑解释
这个正则的核心是用否定前瞻排除所有合法输入,只匹配违规内容:
^匹配字符串开头(?!\s*[@#][^,]*(?:,\s*[@#][^,]*)*$):否定前瞻,意思是后面的内容不能匹配合法规则。这里的合法规则对应你的需求:\s*[@#]:开头允许零或多个空白符,紧跟#或@[^,]*:后面可以跟任意非逗号的字符(?:,\s*[@#][^,]*)*:允许重复出现“逗号 + 零或多个空白符 +#/@+ 任意非逗号字符”的结构$匹配字符串结尾
.+$:匹配至少一个字符的内容(主动排除空字符串,因为空字符串是允许的)
这样一来,只有当输入是非空且不符合规范的内容时,这个正则才会匹配成功,触发Symfony约束的错误提示。
Symfony表单约束配置示例
在你的表单类型类中,可以这样配置该约束:
use Symfony\Component\Validator\Constraints\Regex; // ... $builder->add('target_field', null, [ 'constraints' => [ new Regex([ 'pattern' => '/^(?!\s*[@#][^,]*(?:,\s*[@#][^,]*)*$).+$/', 'match' => true, // 因为正则匹配的是违规内容,所以match设为true时,匹配到就触发报错 'message' => '输入格式错误:开头或逗号后必须紧跟零或多个空白符,再接#或@符号。', ]), ], ]);
验证场景测试
- 合法输入(不会触发错误):
- 空字符串
#test@demo#foo, @bar@abc, #def, xyz(逗号后满足空白+@/#即可,后续非逗号内容无限制)
- 违规输入(会触发错误):
test(开头无@/#)#foo, bar(逗号后未跟@/#)@foo,baz(逗号后缺少空白+@/#结构)123@test(开头为非空白/非@/#字符)
内容的提问来源于stack exchange,提问作者Jimmy P
相关产品推荐
相关产品推荐

