我最近更新到PHP 5.3并得到了一些弃用的错误。
Warning: preg_match() [function.preg-match]: Unknown modifier '@' in
首先,我想提一下,我已经检查了下面的链接并尝试了建议的内容。
preg_match(): Unknown modifier '@'和How can I convert ereg expressions to preg in PHP?
......但是当我确实从
进行更改时function check_email_address($email) {
if (!ereg("^[^@]{1,64}@[^@]{1,255}$", $email)) {
到
function check_email_address($email) {
if (preg_match("/^[^@]{1,64}@[^@]{1,255}$/", $email)) {
并尝试了
if (preg_match('/^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}$/i', $email);
我的注册页面不接受电子邮件,并说电子邮件无效。
但与此同时警告"Unknown modifier '@'"
已经消失。
所以事情是正确的,但仍然有点不对劲。只需要一些帮助。
有任何建议或提示吗?
答案 0 :(得分:3)
您可以使用PHP的内置filter_var()。
function check_email_address($email) {
return filter_var($email, FILTER_VALIDATE_EMAIL) ? true : false;
}
if(!check_email_address($_POST['email']))
exit("Invalid email address");
或简单地说:
if(!filter_var($_POST['email'], FILTER_VALIDATE_EMAIL))
exit("Invalid email address");
答案 1 :(得分:2)
首次使用preg_match
时出现“未知修饰符”问题是由于未使用分隔符。 PHP中的preg_ *函数寻找分隔符(通常为/
)来启动和结束正则表达式。分隔符是您用作第一个字符的任何内容。在preg_match("^[^@]{1,64}@[^@]{1,255}$", $email)
中,分隔符为^
,因此正则表达式是前两个^
之间的所有内容。这意味着在第二个^
之后的所有内容(包括@
)都被视为修饰符。这就是添加斜杠有帮助的原因。
您修改过的代码拒绝了有效的电子邮件,因为您遗漏了!
声明中的if
:
if (!preg_match('/^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}$/i', $email);
正如其他人指出的那样,无论如何,filter_var($email, FILTER_VALIDATE_EMAIL)
是一种更简单,更不容易出错的过滤电子邮件地址的方法。