Shopsystem ShopPilot

ShopPilot => SSP - Shop Server Pages => Thema gestartet von: dobra am Mai 19, 2009, 17:19:25

Titel: RegEx Frage
Beitrag von: dobra am Mai 19, 2009, 17:19:25
Hallo,

ich habe nachgebaute "Inline Fehlermeldungen mit Bedingung" bei denen 2 mail Adressen überprüft werden sollen.
das funktioniert genau so wie es soll  :D
die mail Prüfung ist nur grob, reicht aber für diesen Zweck im Prinzip aus.
eine Bedingung würde ich allerdings sehr gerne noch dazu nehmen:
kein "www." am Anfang, da ich diesen Fehler bei meinen Kunden immer wieder habe

bei meiner Suche im web habe ich eine lustige Definition gefunden
Zitat
Wenn man in einem Script etwas sieht, das so aussieht, als wenn der Programmierer eingeschlafen und mit dem Kopf auf die Tastatur gefallen ist, dann hat man wahrscheinlich RegEx gefunden
aber leider keine Lösung wie ich eine zusätzliche Prüfung auf www (also Adressen wie www.name@domain.xx) einbauen kann.

mein einschlafundmitKopfaufTastaturfall Code schaut jetzt so aus:
if ($mail !~  /^([^\s@,:"<>]+)@([^\s@,:"<>]+\.[^\s@,:"<>.\d]{2,}|(\d{1,3}\.){3}\d{1,3})$/)   {$fehler = qq|fehler1=mail1f|;}
kann mir da bitte jemand helfen?
Titel: Re: RegEx Frage
Beitrag von: ahe am Mai 20, 2009, 01:07:41
if ($mail !~  /^([^\s@,:"<>]+)@([^\s@,:"<>]+\.[^\s@,:"<>.\d]{2,}|(\d{1,3}\.){3}\d{1,3})$/)   {$fehler = qq|fehler1=mail1f|;}
if ($mail =~ /^www\./i) {$fehler = qq|fehler1=mail1f|;}

 8)
Titel: Re: RegEx Frage
Beitrag von: dobra am Mai 20, 2009, 05:21:37
Hallo ahe,

Danke
so geht's natürlich auch ;)
nachdem ich aber noch einige komplexere Bedingungen mit mehreren verschachtelten && und || habe, wollte ich die www Prüfung eigentlich integriert und nicht separat machen...

Nachtrag:
hab's geschafft  :D
SO werden jetzt alle Bedingungen und Fehlermeldungen mit Prüfung auf www. korrekt verarbeitet:
my $fehler;
if ($nachricht ne "3" &&  !length($mail)) { $fehler = qq|fehler1=mail1|;}
if (($nachricht ne "3" && length($mail) && $mail !~  /^([^\s@,:"<>]+)@([^\s@,:"<>]+\.[^\s@,:"<>.\d]{2,}|(\d{1,3}\.){3}\d{1,3})$/) || $mail =~ /^www./i)   {$fehler = qq|fehler1=mail1f|;}
if ($antwort ne "2" && !length($absender)) { $fehler = qq|fehler2=mail2|;}
if (($antwort ne "2" && length($absender) && $absender !~  /^([^\s@,:"<>]+)@([^\s@,:"<>]+\.[^\s@,:"<>.\d]{2,}|(\d{1,3}\.){3}\d{1,3})$/) || $absender =~ /^www./i)  {$fehler = qq|fehler2=mail2f|;}
if (($nachricht ne "3" && length($mail ) < 8)  && ($antwort ne "2" &&  length($absender ) < 8) )  {  $fehler = qq|fehler1=mail1&fehler2=mail2|;}

if (($nachricht eq "3" || ($mail =~ /^([^\s@,:"<>]+)@([^\s@,:"<>]+\.[^\s@,:"<>.\d]{2,}|(\d{1,3}\.){3}\d{1,3})$/ && $mail !~ /^www./)) && ($antwort eq "2" || ($absender =~ /^([^\s@,:"<>]+)@([^\s@,:"<>]+\.[^\s@,:"<>.\d]{2,}|(\d{1,3}\.){3}\d{1,3})$/ && $absender !~ /^www./)) ){

my $ok = qq|UPDATE $table SET SCHREIBEN = '$schreiben',FREISCHALTEN = '$frei',ANTWORTEN = '$antwort',NACHRICHT='$nachricht',A_FREI = '$commfrei',AEMAIL='$mail',ABSENDER='$absender'|;
ssp::exec_sql($ok, 1);
my $err = ssp::get_last_sqlerr();
if (!$err) {$errmsg = "Die Änderungen wurden gespeichert"; }
}
else {
use CGI qw(:standard);
print redirect(
-URL => "$ssp::xxpath?showbynamebl_global,__xxsession__,,,$fehler",
);
}

Titel: Re: RegEx Frage
Beitrag von: ahe am Mai 20, 2009, 08:41:49
Hallo dobra,

für solche Anwendungsfälle wurden in der Programmierung die Funktionen erfunden ;)


sub is_valid_email {
    my $mail = shift;
    return ($mail =~ /^([^\s@,:"<>]+)@([^\s@,:"<>]+\.[^\s@,:"<>.\d]{2,}|(\d{1,3}\.){3}\d{1,3})$/ && $mail !~ /^www./);
}   

Dann brauchen Sie nicht mitten im Code jedes mal den ganzen regulären Ausdruck mit && / || Verknüpfung zu schreiben sondern zb


if (($nachricht ne "3" && length($mail) && !is_valid_email($mail))   {$fehler = qq|fehler1=mail1f|;}   
Titel: Re: RegEx Frage
Beitrag von: dobra am Mai 20, 2009, 08:45:00
Hallo ahe,

vielen Dank!!!
ich muß halt noch viiiiiiiieeeeeel lernen....