preg_match无法在电子邮件中找到“Dash”

时间:2014-05-12 07:17:03

标签: php preg-match

我正在使用以下功能从文本中提取电子邮件地址。

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

请告知。

3 个答案:

答案 0 :(得分:2)

Dash在正则表达式中具有特殊含义。因此无法直接使用,需要使用反斜杠进行转义。以下是更新的代码:

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;
}

答案 1 :(得分:1)

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

[_a-z0-9\-]

答案 2 :(得分:1)

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

通常,验证电子邮件的良好做法归结为:

  1. 最低限度的验证 - 只需检查那里的@及其全部内容。
  2. 只需发送该电子邮件 - 不要检查其他任何内容。如果它将被发送 - 那么它确实是一封有效的电子邮件。
  3. 有关详细信息,请查看http://davidcel.is/blog/2012/09/06/stop-validating-email-addresses-with-regex/或任何类似文章。