所以我在一个带有电话号码的表单中有一个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*
答案 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}