验证规则:
$this->form_validation->set_rules('username','Username','trim|required|xss_clean|regex_match[a-z0-9]');
错误:
Severity: Warning
Message: preg_match() [function.preg-match]: Delimiter must not be alphanumeric or backslash
它需要有一个分隔符,所以像/ a-z0-9 /(如果你在Codeigniter中使用反斜杠分隔符有问题,你有许多其他选项:见The manual page on PCRE delimiters)
现在你有一个模式,字面上匹配一个字符串,其中包含一个-Z0-9.请注意,如果您尝试将其作为字符类进行匹配,则需要再次将其括在括号中以使其成为那样,所以/ [a-z0-9] /
现在我假设您确实想要检查整个字符串是否为(小写)字母数字,而不仅仅是它具有与之匹配的字符.在这种情况下,你需要一个前锚,你的角色类匹配,一个重复修饰符(我假设你不想匹配一个空字符串并使其成为一个或多个),然后一个锚来指定匹配必须延伸到最后:
/ ^ [a-z0-9] $/
您甚至可以通过用大括号替换加号来设置最小长度并提供最小值,最大值(保留最大值以允许它超过最小值的任何长度)…例如/ ^ [a-z0-9] {3,} $
所以你的第三个参数最终看起来像:
‘trim | required | xss_clean | regex_match [/ ^ [a-z0-9] $/]’
除了这显然不会在codeigniter中工作(截至2011年3月,无论如何都是如此),由于它如何处理验证规则中的括号,所以你需要使用回调(see here).
使用callback:
您可以在控制器(或其他适当的范围)中放置如下所示的函数:
public function _usernameRegex($userName) { if (preg_match('/^[a-z0-9]+$/',$userName ) ) { return TRUE; } else { return FALSE; } }
set_rules('username','trim|required|xss_clean|callback__usernameRegex');
注意:如果在控制器中创建回调函数,则该函数以前导下划线命名,以防止URL访问.有一种替代方法可以通过创建扩展CI_Form_validation类的类来实现,但这似乎是一个更复杂的解决方案.如果使用前导下划线命名函数,请记住必须在规则中包含该函数,这会导致callback__usernameRegex总共有两个下划线:一个用于callback_的前缀,第二个用于函数名称_usernameRegex.这可能完全是直截了当的,不需要向你指出,但对我来说,它似乎很容易被遗漏.有关扩展CI_Form_validation的详细说明,请参阅Adding custom callback to Codeigniter Form Validation的链接答案.请注意,如果扩展表单验证,则在set_rules中引用函数时,不需要使用callback_附加函数.
您还可以为新回调设置消息:
$this-> form_validation-> set_message(‘usernameRegex’,’%s字段必须只包含小写字母和/或数字’);
替代路线是修改在form_validation规则上使用的Codeigniter自己的模式匹配.链接到Ellislab的论坛描述了问题,然后找到了解决它的潜在方法further down the thread.从浏览Codeigniter代码和指定的修复程序,他们提供的建议解决方案可能会破坏规则中的数组:更好的正则表达式替换使用递归匹配的Codeigniter函数可以解决这两个问题,但可能会遇到较重规则的性能问题.
对于form_validation规则,Codeigniter的模式匹配可以在其系统/ libraries / Form_validation.PHP文件中找到,在第115行中从2.1.3开始.