2014-03-14 33 views
0

所以我有一個表單中的HTML字段需要一個電話號碼。它在使用()或/或 - 時正確驗證它,但是,如果我放入555 123 4567,它將返回555.一如既往,您的幫助非常感謝。正則表達式驗證電話號碼,但用perl戳記空白空間

這裏是我的代碼

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* 

回答

1

該正則表達式你使用一個看起來過於複雜。你有很多捕獲組,但是我感覺你主要使用它們來定義帶有垂直條的「OR」語句。如果您只選擇單個字符,則爲此使用括號通常會更容易。另外,對於普通空格使用\s並不是一個好主意,因爲這實際上會匹配任何空格字符(製表符和換行符)。也許嘗試是這樣的:

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

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*