preg_match()[function.preg-match]:未知的修饰符'@'

时间:2014-02-21 18:18:11

标签: php regex preg-match ereg

我最近更新到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 '@'"已经消失。

所以事情是正确的,但仍然有点不对劲。只需要一些帮助。

有任何建议或提示吗?

2 个答案:

答案 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)是一种更简单,更不容易出错的过滤电子邮件地址的方法。