我试图弄清楚我在验证规则上做错了什么,因为它说这个错误.
验证规则:
$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开始.