因此,我在表单中有一个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*发布于 2014-03-14 09:03:21
我知道这是任务的一部分,所以你可能会在特定的限制下工作。然而,老实说,你试图抽象出你的数据验证只会让事情变得混乱和难以遵循。它还将您绑定到特定的正则表达式测试,这实际上可能不是最好的选择。如前所述,电子邮件验证应该通过一个模块来完成。
此外,对于这个电话验证,一个更简单的解决方案是去掉任何不是数字的东西,然后进行验证测试。下面的代码演示了我正在讨论的内容:
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*发布于 2014-03-14 08:46:32
您正在使用的正则表达式看起来过于复杂。你有很多捕获组,但我感觉你主要是用它们来定义带有竖线的"OR“语句。通常,如果只选择单个字符,则仅使用方括号进行此操作要容易得多。此外,将\s用于普通空格也不是一个好主意,因为这实际上会匹配任何空格字符(制表符和换行符)。也许可以试试这样的东西:
(?:\(?[2-9]\d{2}\)?[-\/ ]?)?[2-9]\d{2}[-\/ ]?\d{4}
https://stackoverflow.com/questions/22393854
复制相似问题