$re = '/(?!(\d){3}(-| |)\1{2}\2\1{4})(?!666|000|9\d{2})(\b\d{3}(-| |)(?!00)\d{2}\4(?!0{4})\d{4}\b)/m';
$str = '################
## Must match:
################
123-45-4891
098-18-6564
123-45-4848
702-02-0202
001-14-0004
009958881
078-05-1120
009 95 8881
123-45-4891 is my ssn
my ssn is 123-45-4891
my ssn is 123-45-4891 ok?
my ssn is 123-45-4891.
123454891 is my ssn
my ssn is 123454891
my ssn is 123454891 ok?
my ssn is 123454891.
123 45 4891 is my ssn
my ssn is 123 45 4891
my ssn is 123 45 4891 ok?
my ssn is 123 45 4891.
my ssn is:123-45-4891.
my ssn is:123 45 4891.
my ssn is:123454891.
################
## Must not match:
################
# Same number sequences:
222-22-2222
444 44 4444
555555555
# Telephone
1-234-567-8901
1-234-567-8901
1-234-567-8901
1 (234) 567-8901
12345678901
# Credit card
5500 0000 0000 0004
3400 0000 0000 009
3000 0000 0000 04
5500-1244-2232-0004
3400-1244-0000-009
3000-1244-1234-04
# mixed (space), dash and (no space)
009 95-8881
009-95 8881
009 958881
00995 8881
# Zero sequence
231-84-0000
231-00-7289
000-87-7289
231 84 0000
231 00 7289
000 87 7289
231840000
231007289
000877289
# Starting with 9
908-78-0485
908 78 0485
908780485
# Random Numbers
1234567890112371298739872891738912738937289d712897381297381927d3128937893d7218947d1892742189duc89789v127c897412987893c12893c79
122-426-389
187-5-43212
187-0-43212
2423-45-6789
myssnnumberis123-45-4891ok?';
preg_match_all($re, $str, $matches, PREG_SET_ORDER, 0);
// Print the entire match result
var_dump($matches);
Please keep in mind that these code samples are automatically generated and are not guaranteed to work. If you find any syntax errors, feel free to submit a bug report. For a full regex reference for PHP, please visit: http://php.net/manual/en/ref.pcre.php