【问题标题】:regex validating telephone number, but chops white space using perl正则表达式验证电话号码,但使用 perl 删除空格
【发布时间】:2014-04-19 02:04:23
【问题描述】:

所以我有一个表单中的 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*

【问题讨论】:

    标签: regex perl validation


    【解决方案1】:

    我知道这是一项任务的一部分,因此您可能在特定的限制下工作。但是,您尝试抽象出数据验证实际上只会使事情变得混乱且难以理解。它还将您与特定的正则表达式测试联系起来,这实际上可能不是最好的选择。正如已经说过的,电子邮件验证应该通过一个模块来完成。

    此外,对于此电话验证,更简单的解决方案是去掉任何不是数字的内容,然后进行验证测试。下面的代码演示了我在说什么:

    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*
    

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 2016-12-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-15
        • 2019-08-28
        相关资源
        最近更新 更多