Php 电子邮件regex在某些电子邮件地址上失败

Php 电子邮件regex在某些电子邮件地址上失败,php,regex,email,Php,Regex,Email,我使用以下代码从字符串中解析电子邮件: function get_emails ($str) { $pattern = '/([a-z0-9])(([-a-z0-9._])*([a-z0-9]))*\@([a-z0-9])' . '(([a-z0-9-])*([a-z0-9]))+' . '(\.([a-z0-9])([-a-z0-9_-])?([a-z0-9])+)/i'; preg_match ($pattern, $str, $matches); ret

我使用以下代码从字符串中解析电子邮件:

function get_emails ($str) {
    $pattern = '/([a-z0-9])(([-a-z0-9._])*([a-z0-9]))*\@([a-z0-9])' .
    '(([a-z0-9-])*([a-z0-9]))+' . '(\.([a-z0-9])([-a-z0-9_-])?([a-z0-9])+)/i';

    preg_match ($pattern, $str, $matches);

    return $matches;
}
它运行良好,除非地址在域中有多个句点。所以johndoe@yahoo.com很好,但是johndoe@yahoo.co.uk被割伤johndoe@yahoo.co

我可以更改什么来修复此问题


谢谢

您可以在结尾之前添加一个
+
,即
+/i

如果您的电子邮件正则表达式长度小于几千个字符,则该正则表达式不正确。我在堆栈溢出的某个地方发现了此情况。它可以使用多个句点:
([A-Z0-9.\uz0%-]+@[A-Z0-9.-]+\[A-Z]{2,4})
您还假设名称和域为英语!可怜的老勒内会难过的