首先,您需要修复您的模式。你现在的模式是a-z0-9
它需要有一个分隔符来包围它,比如/a-z0-9/(如果您在使用反斜杠分隔符的 Codeigniter 中遇到问题,您还有许多其他选择:请参阅 The manual page on PCRE delimiters)
现在你有一个模式,它与其中某个位置的 a-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)。
您可以在您的控制器(或其他适当的范围)中放置如下函数:
public function _usernameRegex($userName) {
if (preg_match('/^[a-z0-9]+$/', $userName ) )
{
return TRUE;
}
else
{
return FALSE;
}
}
然后你设置规则来调用你的函数:
set_rules('username', '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', 'The %s field must only contain lowercase letters and/or numbers');
另一种方法是修改 Codeigniter 自己的用于 form_validation 规则的模式匹配。 Ellislab 论坛的链接描述了该问题以及解决该问题的潜在方法further down the thread。通过查看 Codeigniter 代码和指定的修复程序,他们提供的建议解决方案可能会破坏在规则中使用数组:通过使用递归匹配替换 Codeigniter 函数中的一个更好的正则表达式可以解决这两个问题,但可能会遇到更重的性能问题规则。
Codeigniter 的 form_validation 规则模式匹配可在其 system/libraries/Form_validation.php 文件中找到,该文件位于 2.1.3 的第 115 行。