推进正则表达式验证问题

Propel Regex validation issue

我正在使用 Propel 的验证行为来验证从模式中保存的数据。我有一个自动验证器,它使用预保存挂钩来验证保存时的数据。

有问题的模式如下:

<behavior name = "validate">
        <parameter name = "username"
                   value = "{column: username, validator: Regex,
                   options: {pattern: &quot;/^[a-zA-Z0-9_?]{1,20}$/D&quot;}}"/>
        <parameter name = "email" value = "{column: email, validator: Email}"/>
</behavior>

用户名列的架构:

<column name="username" type="varchar" size="20" required="true" primaryString="true">

电子邮件列的验证器按预期工作,但是,用户名的验证器不是。它应该匹配使用长度在 1 到 20 个字符之间的字母、数字、下划线或问号的用户名。在当前状态下,每次将 save() 保存到此 table 都会引发异常,包括有效的用户名。

但是,如果我将正则表达式更改为 /^[a-zA-Z0-9_?]{1,20}/(删除 $ 和 D),它会允许所有内容,包括无效的用户名。

可以找到相关的 Propel 文档 here

尝试删除 "D" 修饰符。这只会在用户名中有换行符时更改行为,但在这种情况下,您没有在允许的字符组中包含 \r 或 \n ,因此它无论如何都会像您期望的那样失败

&quot;/^[a-zA-Z0-9_?]{1,20}$/&quot;

您不能删除美元符号 ($),因为在这种情况下,只会考虑表达式的前 20 个字符,而不会在您添加更多字符时失败