Tein tällaisen ja vähän kalvaa regular expressions homma. En ole oikein nielaissut.
<html> <head> <title>hetu hommaa</title> <meta http-equiv="content-type" content="text/html; charset=iso-8859-1" /> </head> <?php if (array_key_exists('nappi', $_POST)){ extract($_POST); $kuvio = '^([0-2][0-9]|3[0-1])(0[0-9]|1[0-2])([0-9][0-9])([\+-A])([[:digit:]]{3})([A-Z]|[[:digit:]])$'; eregi($kuvio, $sotu, $tulos); var_dump($tulos); echo "<br>"; if (eregi($kuvio, $sotu)) { echo("<br>sotu: $sotu on kelvollista muotoa<br><br>"); $numerot=$tulos[1].$tulos[2].$tulos[3].$tulos[5]; $luku = (int)$numerot; $jaannos=$luku % 31; $lista=array (10=>'A', 11=>'B', 12=>'C', 13=>'D', 14=>'E', 15=>'F', 16=>'H', 17=>'J', 18=>'K', 19=>'L', 20=>'M', 21=>'N', 22=>'P', 23=>'R', 24=>'S', 25=>'T', 26=>'U', 27=>'V', 28=>'W', 29=>'X', 30=>'Y'); if ($jaannos<10) $tarkistus = $jaannos; else $tarkistus=$lista[$jaannos]; echo "laskettu tarkistusmerkki: $tarkistus<br>"; if ($tulos[6]==$tarkistus) echo "$tulos[6] on sama kuin laskettu tarkistusmerkki: $tarkistus"; else echo "tarkistusmerkki ei täsmää"; }else echo "sotun pitää olla muotoa ppkkvv[+-A]nnnx"; } ?> <form name="hetuinput" action="<?php echo $SCRIPT_NAME?>" method="POST"> Anna sotu <input type="text" name="sotu" value="" /> <input type="submit" value="Tarkista" name="nappi"/> </form> </body> </html>
Kommenteja kiitos.
En yrittäisi itse tarkistaa regexpillä numeroiden suuruutta, vain että muoto on oikea ja alustava ryhmittely jatkotarkastelua varten:
([0-9]{2})([0-9]{2})([0-9]{2})...
Päivän olemassaolon tarkistaisin PHP:n checkdatella: https://www.php.net/manual/en/function.
([\+-A])
Tuo saattaa käsittää viivan välimäärittelynä,
([\+A-])
Toiminee varmemmin. Plussaa ei tarvinne eskapettaa hakasulkeiden sisällä?
Lisäksi <body>-tagi puuttuu.
Tällaistako ajattelit?
<html> <head> <title>hetu hommaa</title> <meta http-equiv="content-type" content="text/html; charset=iso-8859-1" /> </head> <body> <?php if (array_key_exists('nappi', $_POST)){ extract($_POST); $kuvio = '(^[0-2][0-9]|3[0-1])(0[0-9]|1[0-2])([0-9][0-9])([+A-])([[:digit:]]{3})([A-Z]|[[:digit:]])$'; eregi($kuvio, $sotu, $tulos); var_dump($tulos); echo "<br>"; if (eregi($kuvio, $sotu, $tulos)) { echo("<br>sotu: $sotu on kelvollista muotoa<br><br>"); $day=(int)$tulos[1];$month=(int)$tulos[2]; if ($tulos[4]=='+') $vuosisata='18'; if ($tulos[4]=='-') $vuosisata='19'; if ($tulos[4]=='A') $vuosisata='20'; $vuosi=$vuosisata.$tulos[3]; $year=(int)$vuosi; if (checkdate($month, $day, $year)){ $numerot=$tulos[1].$tulos[2].$tulos[3].$tulos[5]; $luku = (int)$numerot; $jaannos=$luku % 31; $lista=array (10=>'A', 11=>'B', 12=>'C', 13=>'D', 14=>'E', 15=>'F', 16=>'H', 17=>'J', 18=>'K', 19=>'L', 20=>'M', 21=>'N', 22=>'P', 23=>'R', 24=>'S', 25=>'T', 26=>'U', 27=>'V', 28=>'W', 29=>'X', 30=>'Y'); if ($jaannos<10) $tarkistus = $jaannos; else $tarkistus=$lista[$jaannos]; echo "laskettu tarkistusmerkki: $tarkistus<br>"; if ($tulos[6]==$tarkistus) echo "$tulos[6] on sama kuin laskettu tarkistusmerkki: $tarkistus"; else echo "tarkistusmerkki ei täsmää"; } else echo "päivämäärä ei kelpaa"; }else echo "sotun pitää olla muotoa ppkkvv[+-A]nnnx"; } ?> <form name="hetuinput" action="<?php echo $SCRIPT_NAME?>" method="POST"> Anna sotu <input type="text" name="sotu" value="" /> <input type="submit" value="Tarkista" name="nappi"/> </form> </body> </html>
Pikaisesti silmäiltynä näyttää hyvältä. En kuitenkaan testannut, joten toiminnasta en osaa sanoa.
Tein funktion
<?php function onkohetu($ehdotus){ $kuvio = '(^[0-2][0-9]|3[0-1])(0[0-9]|1[0-2])([0-9][0-9])([+A-])([[:digit:]]{3})([A-Z]|[[:digit:]])$'; if (eregi($kuvio, $ehdotus, $tulos)) { $day=(int)$tulos[1];$month=(int)$tulos[2]; if ($tulos[4]=='+') $vuosisata='18'; if ($tulos[4]=='-') $vuosisata='19'; if ($tulos[4]=='A') $vuosisata='20'; $vuosi=$vuosisata.$tulos[3]; $year=(int)$vuosi; if (checkdate($month, $day, $year)){ $numerot=$tulos[1].$tulos[2].$tulos[3].$tulos[5]; $luku = (int)$numerot; $jaannos=$luku % 31; $lista=array (10=>'A', 11=>'B', 12=>'C', 13=>'D', 14=>'E', 15=>'F', 16=>'H', 17=>'J', 18=>'K', 19=>'L', 20=>'M', 21=>'N', 22=>'P', 23=>'R', 24=>'S', 25=>'T', 26=>'U', 27=>'V', 28=>'W', 29=>'X', 30=>'Y'); if ($jaannos<10) $tarkistus = $jaannos; else $tarkistus=$lista[$jaannos]; if ($tulos[6]==$tarkistus) return ''; else return 'tarkistusmerkki ei täsmää'; } else return 'päivämäärä ei kelpaa'; }else return 'sotun pitää olla muotoa ppkkvv[+-A]nnnx'; } ?>
Lukuja 900-999 ei käytännössä ole.
Tarkistusmerkki täsmää miehelle. tai
tarkistusmerkki täsmää naiselle.
Aihe on jo aika vanha, joten et voi enää vastata siihen.