|
1
|
|
|
<?php |
|
2
|
|
|
|
|
3
|
|
|
namespace IsoCodes; |
|
4
|
|
|
|
|
5
|
|
|
/** |
|
6
|
|
|
* @example : |
|
7
|
|
|
* echo Ssn::validate('557-26-9048'); |
|
8
|
|
|
* |
|
9
|
|
|
* As of 2011 SSN's are completely randomized |
|
10
|
|
|
* @link : http://www.socialsecurity.gov/employer/randomization.html) |
|
11
|
|
|
* @source : http://haxorfreek.15.forumer.com/a/us-social-security-number-ssn-generator_post1847.html |
|
12
|
|
|
* @source : https://gist.github.com/Kryptonit3/7b6bff5abab4a62e2b796a0e5a9ab94e |
|
13
|
|
|
* |
|
14
|
|
|
* Some special numbers are never allocated: |
|
15
|
|
|
* Numbers with all zeros in any digit group (000-##-####, ###-00-####, ###-##-0000).[36][37] |
|
16
|
|
|
* Numbers with 666 or 900–999 (Individual Taxpayer Identification Number) in the first digit group.[36] |
|
17
|
|
|
* special cases to care bout: |
|
18
|
|
|
* @link : https://stackoverflow.com/questions/1517026/how-can-i-validate-us-social-security-number/18385786#18385786 |
|
19
|
|
|
*/ |
|
20
|
|
|
class Ssn implements IsoCodeInterface |
|
21
|
|
|
{ |
|
22
|
|
|
|
|
23
|
|
|
/** |
|
24
|
|
|
* SSN validation. |
|
25
|
|
|
* |
|
26
|
|
|
* @param string $ssn |
|
27
|
|
|
* |
|
28
|
|
|
* @return bool |
|
29
|
|
|
*/ |
|
30
|
|
|
public static function validate($ssn) |
|
31
|
|
|
{ |
|
32
|
|
|
$ssn = trim($ssn); |
|
33
|
|
|
|
|
34
|
|
|
// Must be in format AAA-GG-SSSS or AAAGGSSSS |
|
35
|
|
|
if (!preg_match("/^([0-9]{9}|[0-9]{3}-[0-9]{2}-[0-9]{4})$/", $ssn)) { |
|
36
|
|
|
return false; |
|
37
|
|
|
} |
|
38
|
|
|
|
|
39
|
|
|
$forbidden = [ |
|
40
|
|
|
'078-051-120', // Woolworth Wallet Fiasco |
|
41
|
|
|
'219-099-999' // Was used in an ad by the Social Security Administration |
|
42
|
|
|
]; |
|
43
|
|
|
|
|
44
|
|
|
if (in_array($ssn, $forbidden)) { |
|
45
|
|
|
return false; |
|
46
|
|
|
} |
|
47
|
|
|
|
|
48
|
|
|
$ssnFormatted = (strlen($ssn) == 9) ? preg_replace("/^([0-9]{3})([0-9]{2})([0-9]{4})$/", "$1-$2-$3", $ssn) : $ssn; |
|
49
|
|
|
$ssn_array = explode('-', $ssnFormatted); |
|
50
|
|
|
|
|
51
|
|
|
// number groups must follow these rules: |
|
52
|
|
|
// * no single group can have all 0's |
|
53
|
|
|
// * first group cannot be 666, 900-999 |
|
54
|
|
|
// * second group must be 01-99 |
|
55
|
|
|
// * third group must be 0001-9999 |
|
56
|
|
|
|
|
57
|
|
|
foreach ($ssn_array as $group) { |
|
58
|
|
|
if ($group == 0) { |
|
59
|
|
|
return false; |
|
60
|
|
|
} |
|
61
|
|
|
} |
|
62
|
|
|
|
|
63
|
|
|
// Forbidden numbers |
|
64
|
|
|
return !($ssn_array[0] == 666 || $ssn_array[0] === '000' || $ssn_array[0] > 899); |
|
65
|
|
|
} |
|
66
|
|
|
} |
|
67
|
|
|
|