Php 推进正则表达式验证问题

Php 推进正则表达式验证问题,php,regex,validation,propel,Php,Regex,Validation,Propel,我正在使用spreep的validate行为来验证模式中的save数据。我有一个自动验证器,它使用预保存挂钩来验证保存时的数据 所讨论的模式如下: <behavior name = "validate"> <parameter name = "username" value = "{column: username, validator: Regex, options: {pattern

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

所讨论的模式如下:

<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()都会引发异常,包括有效用户名

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

可以找到相关的推进文档。

尝试删除“D”修饰符。这只会在用户名中有新行时更改行为,但在这种情况下,您没有将\r或\n包含在“允许的字符”组中,因此它仍将按预期失败

&quot;/^[a-zA-Z0-9_?]{1,20}$/&quot;
您不能删除美元符号($),因为在这种情况下,表达式的前20个字符中只会考虑美元符号($),如果再添加一些,则不会失败