正则表达式验证电话号码,但使用perl来填充空格

时间:2014-03-14 00:29:21

标签: regex perl validation

所以我在一个带有电话号码的表单中有一个HTML字段。它在我使用()或/或 - 时正确验证它,但是,如果我输入说555 123 4567,它返回555.一如既往,你的帮助非常赞赏它。

这是我的代码

my $userName=param("userName");
my $password=param("password");
my $phoneNumber=param("phoneNumber");
my $email=param("email");
my $onLoad=param("onLoad");

my $userNameReg = "[a-zA-Z0-9_]+";
my $passwordReg = "([a-zA-Z]*)([A-Z]+)([0-9]+)";
my $phoneNumberReg = "((\(?)([2-9]{1}[0-9]{2})(\/|-|\)|\s)?([2-9]{1}[0-9]{2})(\/|-|\s)?([0-9]{4}))";
my $emailReg = "([a-zA-Z0-9_]{2,})(@)([a-zA-Z0-9_]{2,})(.)(com|COM)";


if ($onLoad !=1)
{
@controlValue = ($userName, $password, $phoneNumber, $email);
@regex = ($userNameReg, $passwordReg, $phoneNumberReg, $emailReg);
@validated;

for ($i=0; $i<4; $i++)
{
    $retVal= validatecontrols ($controlValue[$i], $regex[$i]);
    if ($retVal)
    {
        $count++;
    }
    if (!$retVal)
    {
        $validated[$i]="*"
    }           
}

sub validatecontrols  
{       
    my $ctrlVal = shift();
    my $regexVal = shift();
    if ($ctrlVal =~ /^$regexVal$/)
    {
        return 1;
    }

    return 0;
}
}

*html code is here*

2 个答案:

答案 0 :(得分:2)

我意识到这是作业的一部分,所以你可能会在特定的限制下工作。但是,您抽象出数据验证的尝试实际上只是让事情变得混乱而难以理解。它还会将您与特定的正则表达式测试联系起来,这可能实际上并不是最好的选择。如前所述,电子邮件验证应通过模块完成。

此外,对于此手机验证,更简单的解决方案是删除任何非数字的内容,然后进行验证测试。以下代码演示了我在说什么:

my $userName = param("userName");
my $password = param("password");
my $phoneNumber = param("phoneNumber");
my $email = param("email");
my $onLoad = param("onLoad");

my $error = 0;

if ($onLoad !=1)
{
    if ($username !~ /^[a-zA-Z0-9_]+$/) {
        $username = '*';
        $error++;
    }

    if ($password !~ /^[a-zA-Z]*[A-Z]+[0-9]+$/) {
        $password = '*';
        $error++;
    }

    (my $phoneNumOnly = $phoneNumber) =~ s/\D//g;
    if ($phoneNumOnly !~ /^1?[2-9]{1}\d{2}[2-9]{1}\d{6}$/) {
        $phoneNumber = '*';
        $error++;
    }

    if ($email !~ /^\w{2,}\@\w{2,}\.com$/i) {
        $email = '*';
        $error++;
    }
}   

*html code is here*

答案 1 :(得分:1)

你正在使用的正则表达式看起来过于复杂。你有很多捕获组,但我觉得你主要使用它们来定义垂直条的“OR”语句。如果您只选择单个字符,通常使用括号来实现此目的要容易得多。此外,将\s用于普通空格并不是一个好主意,因为这实际上会匹配任何空格字符(制表符和换行符)。也许尝试这样的事情:

(?:\(?[2-9]\d{2}\)?[-\/ ]?)?[2-9]\d{2}[-\/ ]?\d{4}