警告:preg_match()[function.preg match]:未知修饰符'@';


Warning: preg_match() [function.preg-match]: Unknown modifier '@'

不确定在这种情况下我需要做什么,因为我已经尝试了几种方法来解决这个问题。

if(!preg_match("/^[a-z0-9]+([_''.-][a-z0-9]+)^/" ."@"."([a-z0-9]+(['.-][a-z0-9]+)*)+"."''.[a-z]{2,}"."$",$email ))
{
    $response="You entered an invalid e-mail.";
    $form_success   = FALSE;
}

PHP将"/^[a-z0-9]+([_''.-][a-z0-9]+)^/"视为整个表达式(/视为分隔符)。之后的任何内容都将被视为修饰符。@不是有效的修饰符。

也许您想转义最后一个斜杠'/,但在$/末尾缺少一个。为什么在这里使用字符串串联?整个正则表达式似乎与电子邮件地址不匹配。

无论如何,在使用正则表达式之前先学习它们。在这种情况下,最好使用PHP的filter_var:

if (filter_var($email_a, FILTER_VALIDATE_EMAIL)) {
    echo "This (email_a) email address is considered valid.";
}

那个正则表达式非常混乱。使用这个替代:

/^[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:'.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?'.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/

这个表达是你自己写的吗?我建议你在这里阅读regex:

http://www.regular-expressions.info/

正则表达式不起作用的原因是,您期望字符串的串联起作用,但它没有起作用。你的字符串相当于:

/^[a-z0-9]+([_''.-][a-z0-9]+)^/@([a-z0-9]+(['.-][a-z0-9]+)*)+''.[a-z]{2,}$

这有多个问题。

  1. 字符串中有多个(未跳过的)正斜杠(/
  2. 字符串末尾没有正斜杠
  3. 我不确定这是否真的与电子邮件匹配,我必须测试一下

您得到的错误是因为它认为第二个未跳过的正斜杠标志着表达式的结束。所以…

/^[a-z0-9]+([_''.-][a-z0-9]+)^/

就是它所拥有的。之后的所有内容都被视为修饰符(e.x.i表示不区分大小写)。@不是有效的修饰符。

regex中的"修饰符"是出现在主表达式之外的字符。有一些允许的修饰符,它们执行各种操作。例如,"i"修饰符使表达式不区分大小写。"@"不是有效的修饰符。

那你为什么被告知这个?

表达式中有一个/字符,它被视为表达式的末尾,因为它与表达式开头的/匹配。因此,/之后的所有内容都被视为修饰符字符,因为它在表达式之外。

/之后的第一个字符是@,因此这就是要警告的内容。

至于/在那里做什么,我真的说不清——它看起来不应该在那里,前面的^也不应该

我的建议是删除^/,并在表达式的末尾放一个$/

话虽如此,看起来你正在尝试验证和电子邮件地址。如果是这样的话,我建议查找一些有效的表达式,因为这个表达式看起来需要做很多工作(不仅仅是我已经建议的更改)。

希望能有所帮助。