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.