-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathkennitala_function.php
108 lines (85 loc) · 2.25 KB
/
kennitala_function.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
<?php
/*
* PHP function til ad athuga hvort
* Kennitala se rett (gild) eda ekki
* http://www.skra.is/thjodskra/um-thjodskra-/um-kennitolur/
* SOURCE: https://github.com/Teddi96/Kennitala
*/
function kennitala($tala) {
// ath lengd
if(strlen($tala) != 10) {
return "Ogild Kennitala";
}
// d = dagur, m = manudur, y = ar (2 tolurstafir)
$format = 'dmy';
//Faum fyrstu 6 tolustafina
$date = mb_substr($tala, 0, 6);
// Faum dagsetningu
$d = DateTime::createFromFormat($format, $date);
// True or False athugun, villa ef ogild
if($d && $d->format($format) != $date) {
return "Ogild Kennitala";
}
// next two fra og med 20.
$safe = mb_substr($tala, -4, -2);
if($safe < 20) {
return "Ogild Kennitala";
}
/* Array fyrir modulus 11 reikning */
$weight = array( 2, 3, 4, 5, 6, 7,
2, 3);
// First 8 to calculate the 9th number
$first_8 = mb_substr($tala, 0,8);
// First 9 that we were given
$first_9 = mb_substr($tala, 0, 9);
// Turn it around..
$reverse = strrev( $first_8 );
for ( $i = 0, $sum = 0; $i < strlen( $reverse ); $i++ ) {
$sum += substr( $reverse, $i, 1 ) * $weight[ $i ];
}
$reminder = $sum % 11;
switch( $reminder ) {
case 0:
$result = $first_8 . 0;
break;
case 1:
$result = "n/a";
break;
default:
$check_digit = 11 - $reminder;
$result = $first_8 . $check_digit;
break;
}
if( $result != $first_9 ) {
return "Ogild Kennitala";
}
// The last number is the century
$century = mb_substr($tala, 9, 10); // The last number
$year = mb_substr($tala, -6, -4); // Year of birth 2 digit format
$d = DateTime::createFromFormat('y', $year); // Change 2 digit format to 4 digit format
$year = $d->format('Y'); // So we can use the 4 digit format
// 19 century
if($century == 8) {
if(preg_match('/18../', $year)) {
return "Gild Kennitala";
} else {
return "Ogild Kennitala";
}
}
// 20 century
elseif($century == 9) {
if(preg_match('/19../', $year)) {
return "Gild Kennitala";
} else {
return "Ogild Kennitala";
}
}
// 21 Century
elseif($century == 0) {
if(preg_match('/20../', $year)) {
return "Gild Kennitala";
} else {
return "Ogild Kennitala";
}
}
}