2

这是在 phpbb 中验证电子邮件地址的功能的一部分。我有一个有效的电子邮件地址

"pwd-p&r2.coop@..." 但它不被验证接受。

有趣的是,当我尝试“pwd-pr2.co&op@...”时(在“点”之后带有“&”)

和“pwd-pr&2coop@...”(不带“点”),两者都是有效的,

但是“pwd-pr&2.coop@...”(在“&”之后有“点”)不是。

我已经尝试更改正则表达式好几天了,但仍然不知道如何修复它,以便它接受我的电子邮件地址。

function get_preg_expression($mode)
{
    switch ($mode)
    {
        case 'email':
        // Regex written by James Watts and Francisco Jose Martin Moreno
        // http://fightingforalostcause.net/misc/2006/compare-email-regex.php
        return '([\w\!\#$\%\&\'\*\+\-\/\=\?\^\`{\|\}\~]+\.)*(?:[\w\!\#$\%\&\'\*\+\-\/\=\?\^\`{\|\}\~]|&)+@((((([a-z0-9]{1}[a-z0-9\-]{0,62}[a-z0-9]{1})|[a-z])\.)+[a-z]{2,63})|(\d{1,3}\.){3}\d{1,3}(\:\d{1,5})?)';
    break;
    }
}
4

2 回答 2

3

电子邮件不应该使用正则表达式进行验证,这正是这个问题中发生的原因——它很复杂,几乎没有人能做对。

PHP 有一个以函数形式内置的电子邮件验证器filter_var()。这通常是验证电子邮件的最佳选择。

这是一行代码,根本不需要任何复杂的正则表达式。

从上述链接复制的示例(即 PHP 手册):

<?php
$email_a = 'joe@example.com';
$email_b = 'bogus';

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

希望有帮助。

于 2013-05-20T16:15:29.797 回答
1

尝试这个:

function get_preg_expression($mode)
{
    switch ($mode)
    {
        case 'email':
        // Regex written by James Watts and Francisco Jose Martin Moreno
        // http://fightingforalostcause.net/misc/2006/compare-email-regex.php
        // return '^(?:[\w!#$%&\'*+-\/=?^`{|}~]+\.)*(?:[\w!#$%&\'*+-\/=?^`{|}~]|&amp;)+$';
        return '(?:[\w!#$%&\'*+-\/=?^`{|}~]+\.)*(?:[\w!#$%&\'*+-\/=?^`{|}~]|&amp;)+@((((([a-z0-9]{1}[a-z0-9\-]{0,62}[a-z0-9]{1})|[a-z])\.)+[a-z]{2,63})|(\d{1,3}\.){3}\d{1,3}(\:\d{1,5})?)';
    break;
    }
}

我取消了前括号表达式中不需要转义的字符。这似乎成功了。更具体地说,我留下的唯一转义字符是: (a) ',由于 PHP 字符串转义语法,和 (b)/因为我用作/PHP 的 preg 分隔符。

不幸的是,我没有关于为什么这种逃避有帮助的理论。但是,最好的做法是只逃避需要逃避的东西,所以我根据你“应该”做的事情得出了解决方案,所以我很乐意分享。答案并不令人满意,但至少它似乎有效。

这是我用于测试的测试工具,以防它有用,加上匹配性:

function get_preg_expression($mode)
{
    switch ($mode)
    {
        case 'email':
        // Regex written by James Watts and Francisco Jose Martin Moreno
        // http://fightingforalostcause.net/misc/2006/compare-email-regex.php
        // return '^(?:[\w!#$%&\'*+-\/=?^`{|}~]+\.)*(?:[\w!#$%&\'*+-\/=?^`{|}~]|&amp;)+$';
        return '(?:[\w!#$%&\'*+-\/=?^`{|}~]+\.)*(?:[\w!#$%&\'*+-\/=?^`{|}~]|&amp;)+@((((([a-z0-9]{1}[a-z0-9\-]{0,62}[a-z0-9]{1})|[a-z])\.)+[a-z]{2,63})|(\d{1,3}\.){3}\d{1,3}(\:\d{1,5})?)';
    break;
    }
}

var_dump(preg_match('/' . get_preg_expression('email') . '/', 'pwd-pr&2coop@hello.com')); // Matches
var_dump(preg_match('/' . get_preg_expression('email') . '/', 'pwd-pr&2.coop@hello.com')); // Matches
var_dump(preg_match('/' . get_preg_expression('email') . '/', 'pwd-p&r2.coop@hello.com')); // Matches
var_dump(preg_match('/' . get_preg_expression('email') . '/', 'hello')); // Does not match
var_dump(preg_match('/' . get_preg_expression('email') . '/', 'hello@world')); // Does not match
var_dump(preg_match('/' . get_preg_expression('email') . '/', 'hello@world.com')); // Matches
于 2013-05-20T15:17:48.390 回答