首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >正则表达式验证电话号码,但使用perl去掉空格

正则表达式验证电话号码,但使用perl去掉空格
EN

Stack Overflow用户
提问于 2014-03-14 08:29:21
回答 2查看 66关注 0票数 0

因此,我在表单中有一个HTML字段,它接受电话号码。当我使用()或者/或者-但是,如果我输入555 123 4567,它会返回555。一如既往的感谢您的帮助。

以下是我的代码

代码语言:javascript
复制
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*
EN

回答 2

Stack Overflow用户

发布于 2014-03-14 09:03:21

我知道这是任务的一部分,所以你可能会在特定的限制下工作。然而,老实说,你试图抽象出你的数据验证只会让事情变得混乱和难以遵循。它还将您绑定到特定的正则表达式测试,这实际上可能不是最好的选择。如前所述,电子邮件验证应该通过一个模块来完成。

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

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2014-03-14 08:46:32

您正在使用的正则表达式看起来过于复杂。你有很多捕获组,但我感觉你主要是用它们来定义带有竖线的"OR“语句。通常,如果只选择单个字符,则仅使用方括号进行此操作要容易得多。此外,将\s用于普通空格也不是一个好主意,因为这实际上会匹配任何空格字符(制表符和换行符)。也许可以试试这样的东西:

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22393854

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档