Memastikan input betul di dalam Perl
Posted by mkhairulLibrary tersebut dihasilkan untuk memudahkan input yang diterima didalam kriteria tertentu (integer, alpha, alphanumeric, etc). Mungkin ada library yang telah pun wujud didalam CPAN, saya pun tak pasti tetapi saya tidak menjumpainya.
package input_lib;
use CGI::Carp "fatalsToBrowser";
@ISA = qw(Exporter);
@EXPORT = qw (
input_validate
);
my $required = 0;
sub input_validate{
my ($value, $rules) = @_;
use Data::Dumper;
$required = 0;
my @error_messages;
my @rules = split('\|', $rules);
foreach my $rule (@rules)
{
# Extract the rules and param (if there is a param)
# e.g. max_length[5]
@match = ($rule =~ m/(\w+)\[(\d+)\]{0,1}/g);
if(!@match)
{
@match = ($rule =~ m/(\w+)/g);
}
my ($rule, $param);
if(scalar(@match) > 1)
{
$rule = $match[0];
$param = $match[1];
}
elsif(scalar(@match) > 0)
{
$rule = $match[0];
}
else
{
die("Error: No rule");
}
# Execute the rules
# Call a subroutine dynamically
# my $test = "alpha";
# *{$test}{CODE}->(); // Calls the subroutine "alpha" i.e. alpha();
if(!*{$rule}{CODE}->($value, $param))
{
push @error_messages, $rule;
}
}
if($required == 0 && $value eq "")
{
return 0;
}
elsif(scalar(@error_messages))
{
return 1;
}
else
{
return 0;
}
}
sub required{
my ($value) = @_;
$required = 1;
return ($value) ? 1:0;
}
sub alpha{
my ($value) = @_;
return (($value =~ /^([a-z])+$/i)) ? 1:0;
}
sub alpha_space{
my ($value) = @_;
return (($value =~ /^([a-z\s])+$/i)) ? 1:0;
}
sub alpha_numeric{
my ($value) = @_;
return ($value =~ /^([a-z,0-9\s])+$/i) ? 1:0;
}
sub max_length{
my ($value, $length) = @_;
return (length($value) <= $length) ? 1:0;
}
sub min_length{
my ($value, $length) = @_;
return (length($value) >= $length) ? 1:0;
}
sub integer{
my ($value) = @_;
return (($value =~ /^[\-+]?[0-9]+$/)) ? 1:0;
}
sub valid_email{
my ($value) = @_;
return (($value =~ /^([a-z0-9\+_\-]+)(\.[a-z0-9\+_\-]+)*@([a-z0-9\-]+\.)+[a-z]{2,6}$/ix)) ? 1:0;
}
sub valid_time{
my ($time) = @_;
if(!($time =~ m/([0-9]{2})\:([0-9]{2})/)){ return 0; }
my ($hour, $min) = split(/\:/, $time);
if($hour eq "" or $min eq ""){ return 0; }
if($hour > 23 or $hour < 0){ return 0; }
if($min > 59 or $min < 0){ return 0; }
return 1;
}
sub valid_date{
my ($date) = @_; # receives dd/mm/yyyy
my ($day, $month, $year) = split(/\//, $date);
if($day eq ""){ return 0; }
if($month eq "") { return 0; }
if($year eq "") { return 0; }
$date = $month . '/' . $day . '/' . $year;
# taken from OWASP's regex repository, http://www.owasp.org/index.php/OWASP_Validation_Regex_Repository
# regex only supports mm/dd/yyyy
if(!($date =~ m/^(?:(?:(?:0?[13578]|1[02])(\/|-|\.)31)\1|(?:(?:0?[1,3-9]|1[0-2])(\/|-|\.)(?:29|30)\2))(?:(?:1[6-9]|[2-9]\d)?\d{2})$|^(?:0?2(\/|-|\.)29\3(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00))))$|^(?:(?:0?[1-9])|(?:1[0-2]))(\/|-|\.)(?:0?[1-9]|1\d|2[0-8])\4(?:(?:1[6-9]|[2-9]\d)?\d{2})$/))
{ return 0; }
return 1;
}
1;
Agak panjang, kan?
Ianya mudah digunakan cuma include didalam Perl script anda.
use input_lib;
if(input_validate($foo, 'required|integer')){ die("Sila masukkan integer sahaja"); }
Mungkin ada cara yang lebih baik? Jom sembang di bahagian komen.
This entry was posted on Saturday, December 5th, 2009 at 12:15 am and is filed under Tip, perl. You can follow any responses to this entry through the RSS 2.0 feed. You can leave a response, or trackback from your own site.