regex_match的表单验证规则

Kev*_*ith 7 php codeigniter

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

验证规则:

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

错误:

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

tas*_*wyn 14

首先,您需要修复您的模式.你现在的模式是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;
  }
}
Run Code Online (Sandbox Code Playgroud)

然后设置规则以调用您的函数:

set_rules('username', 'Username', 'trim|required|xss_clean|callback__usernameRegex');
Run Code Online (Sandbox Code Playgroud)

注意:如果在控制器中创建回调函数,则该函数以前导下划线命名,以防止URL访问.有一种替代的方法可以通过创建一个扩展CI_Form_validation类的类来实现,但这似乎是一个更复杂的解决方案.如果您使用前导下划线命名该函数,请记住您必须在规则中包含该函数,这会导致callback__usernameRegex总共有两个下划线:一个用于前缀,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函数中的一个更好的正则表达式将解决这两个问题,但可能会遇到更重的性能问题规则.

对于form_validation规则,Codeigniter的模式匹配可以在其系统/ libraries/Form_validation.php文件中找到,在第115行中从2.1.3开始.