Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: sotun/hetun tarkistus php:llä ja regular expressionssilla

lrp [27.05.2009 18:21:45]

#

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.

Chiman [27.05.2009 18:46:31]

#

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.checkdate.php

([\+-A])

Tuo saattaa käsittää viivan välimäärittelynä,

([\+A-])

Toiminee varmemmin. Plussaa ei tarvinne eskapettaa hakasulkeiden sisällä?

Lisäksi <body>-tagi puuttuu.

lrp [27.05.2009 19:25:32]

#

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>

Chiman [27.05.2009 19:52:10]

#

Pikaisesti silmäiltynä näyttää hyvältä. En kuitenkaan testannut, joten toiminnasta en osaa sanoa.

lrp [27.05.2009 20:01:01]

#

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';
}
?>

peg [27.05.2009 20:31:16]

#

Lukuja 900-999 ei käytännössä ole.
Tarkistusmerkki täsmää miehelle. tai
tarkistusmerkki täsmää naiselle.

http://fi.wikipedia.org/wiki/Henkilötunnus

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta