preg_match找不到"Dash"在一封电子邮件里


preg_match can not find the "Dash" in an email

我使用下面的函数从文本中提取电子邮件地址。

function is_valid_email($email) {
    if (preg_match('/^[_a-z0-9-]+('.[_a-z0-9-]+)*@[a-z0-9-]+('.[a-z0-9-]+)*('.([a-z]){2,4})$/',$emailss)) return true;
    else return false;
}

它工作得很顺利,但是有一个问题:带有"破折号"的邮件不能使用:

例如:

info-test@web-site.com出来:test@web

请建议。

破折号在正则表达式中有特殊的含义。所以不能直接使用,需要用反斜杠转义。以下是更新后的代码:

function is_valid_email($email) {
    if (preg_match('/^[_a-z0-9'-]+('.[_a-z0-9'-]+)*@[a-z0-9'-]+('.[a-z0-9'-]+)*('.([a-z]){2,4})$/',$emailss)) return true;
    else return false;
}

您应该转义破折号字符,因为它在使用的上下文中具有特殊的含义(范围):

[_a-z0-9'-]

该电子邮件验证regexp存在无数问题。例如,它不会通过任何完全有效的现代国家顶级域名,它诚实地认为顶级域名最多有4个字母。用户账号部分不允许任意数目的点.,不允许加号+

一般来说,验证电子邮件的良好实践可以归结为:

  1. 最小验证-只需检查那里有@,这就是全部。
  2. 发那封邮件就行了,别检查其他东西。如果它会被发送,那么它确实是一封有效的电子邮件。

更多详细信息,请查看http://davidcel.is/blog/2012/09/06/stop-validating-email-addresses-with-regex/或任何类似的文章。