7

我试图弄清楚我在这个验证规则上做错了什么,因为它说这个错误。

验证规则:

$this->form_validation->set_rules('username', 'Username', 'trim|required|xss_clean|regex_match[a-z0-9]');

错误:

严重性:警告
消息:preg_match() [function.preg-match]:分隔符不能是字母数字或反斜杠

4

3 回答 3

18

首先,您需要修复您的模式。你现在的模式是a-z0-9

它需要有一个分隔符来包围它,例如/a-z0-9/(如果您在使用反斜杠分隔符的 Codeigniter 中遇到问题,您还有许多其他选择:请参阅PCRE 分隔符的手册页

现在您有了一个模式,该模式与其中某个位置的字符串相匹配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 月,无论如何都是这种情况),因为它如何处理验证规则中的括号,所以你需要使用回调(见这里)。

使用回调

您可以在控制器(或其他适当范围)中放置如下函数:

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总共有两个下划线:一个用于前缀 of callback_,第二个用于函数名称,_usernameRegex. 这可能非常简单,不需要向您指出,但在我看来,这似乎很容易被忽略。请参阅将自定义回调添加到 Codeigniter 表单验证的链接答案有关扩展的详细说明CI_Form_validation。请注意,如果您扩展表单验证,callback_则在set_rules.

您还可以为新回调设置消息:

$this->form_validation->set_message('usernameRegex', 'The %s field must only contain lowercase letters and/or numbers');


另一种方法是修改用于 form_validation 规则的 Codeigniter 自己的模式匹配。Ellislab 论坛的链接描述了这个问题,然后是在线程中进一步解决它的潜在方法。通过查看 Codeigniter 代码和指定的修复程序,他们提供的建议解决方案可能会破坏在规则中使用数组:通过使用递归匹配替换 Codeigniter 函数中的一个更好的正则表达式可以解决这两个问题,但可能会遇到更重的性能问题规则。

Codeigniter 对 form_validation 规则的模式匹配可在其 system/libraries/Form_validation.php 文件中找到,该文件位于 2.1.3 的第 115 行。

于 2012-12-21T00:20:33.617 回答
3

使用以下代码在我的最后工作正常

$this->form_validation->set_rules('username', 'Username','trim|required|callback_username_check|regex_match[/^[a-z0-9]+$/]');
于 2020-06-30T06:13:24.690 回答
-1

php 的 preg_match 希望你的正则表达式被一个非字母数字字符包围(通常每个人都使用 /),将你的 setRules() 更改为:

$this->form_validation->set_rules('username', 'Username', 'trim|required|xss_clean|regex_match[/a-z0-9/]');
于 2012-12-21T00:23:10.863 回答