使用CodeIgniter中valid_email方法中的regex来路由一个包含电子邮件的URL,以进行电子邮件验证


Using the regex from valid_email method in CodeIgniter to route a URL with an email in it for email verification

我创建的用于验证用户的电子邮件验证链接如下:

site_url/user@example.com/hash_to_verify

我正在尝试将类似上面的URL路由到注册控制器中的activate_user方法。我尝试使用CodeIgniter中valid_email方法中使用的相同regex,但它似乎不起作用(没有路由到activate_user方法):

$route['registration/(/^([a-z0-9'+_'-]+)('.[a-z0-9'+_'-]+)*@([a-z0-9'-]+'.)+[a-z]{2,6}$/ix)/(:any)'] = 'registration/activate_user/$1';

1) 我的路线哪里出错了?

2) 以这种方式格式化我的URL以验证电子邮件是否可以接受?

感谢

$route['registration/(/^([a-z0-9'+_'-]+)('.[a-z0-9'+_'-]+)*@([a-z0-9'-]+'.)+[a-z]{2,6}$/ix)/(:any)']

应该是:

$route['registration/(['w+-]+)('.['w+-]+)*@([a-zA-Z'd-]+'.)+[a-zA-Z]{2,6}/(:any)']

整个字符串是一个不带分隔符或修饰符的正则表达式。您使用了分隔符、修饰符,还使用了^$

我简化了正则表达式,但是电子邮件验证不应该通过URL进行。相反,您的控制器应该检查该段并对其执行验证。如果它与重定向到重新注册或输出错误消息不匹配,则继续注册。

顺便说一句,验证电子邮件地址时不要重新发明轮子。PHP通过filter_var()函数内置验证。

示例:

$email = 'joe@example.com';
if (filter_var($email, FILTER_VALIDATE_EMAIL)) 
{
    echo 'valid';
}