PHP检查SSN的长度

时间:2014-03-07 17:47:58

标签: php regex

我们正在尝试为我们的招生办公室设置在线申请,我们需要错误检查社会保险号码,以确保他们输入了有效值。 xxx-xx-xxxx或仅9位数。我已经尝试了几次迭代,这就是我现在所做的:

$ssn = $form_values['submitted_tree']['biographical_information']['social_security_number'];

if (strlen($ssn) > 0 && preg_match('/^([0-9]){3}(([ ]|[-])?([0-9]){2})(([ ]|[-])?([0-9]){4})?$/', $ssn) == 0) { 
    form_set_error('submitted][biographical_information][social_security_number', t('You must enter a valid Social Security Number: ###-##-####')); 
}

5 个答案:

答案 0 :(得分:2)

由于您没有进行“真正的”SSN验证(例如,它们不是以0开头)。我会为除了数字字符之外的所有内容做一个preg_replace然后你可以检查长度为== 9.

preg_replace("/[^0-9]/","",$input);

然后你可以允许人们进入他们想要的社交(xxx-xx-xxxx或xxx.xx.xxxx等)并且验证仍然有效。我不时用电话号码做同样的事。

答案 1 :(得分:1)

为什么不简单地从字符串中删除任何-,然后验证它是9位?

$ssn = ...;
$ssn_validate = str_replace('-', '', $ssn);
$pattern = '/^[0-9]{9}$/';
if(preg_match($pattern, $ssn_validate)) {
    // it matched
}

答案 2 :(得分:1)

这应该可以解决问题:

if( (is_numeric($ssn) && strlen($ssn) == 9)
   || preg_match("/^[0-9]{3}-[0-9]{2}-[0-9]{4}$/", $ssn) ){

    echo "valid";

} else {

    echo "invalid";

}

这将确保社会安全号码纯粹为9位数或遵循正确的格式(xxx-xx-xxxx)

答案 3 :(得分:0)

简单解决方案:删除所有非数字字符,然后验证剩下的内容。

$ssn = preg_replace('~\D~', '', $ssn); // replace all non-digits
if(preg_match('~^\d{9}$~', $ssn)) { // look for exactly 9 digits
    echo "valid";
} else {
    echo "invalid";
}

注意:这与Matt Thompson(正确)答案的概念相同,但充实了更多。

如果您想进行更准确的验证,您可以检查它是否在任何群组中都没有全部零,并且不是虚假号码。 (来源:Wikipedia):

$ssn = preg_replace('~\D~', '', $ssn); // replace all non-digits
if(preg_match('~^(?!000|666|9\d\d)\d{3}(?!00)\d{2}(?!0000)\d{4}$~', $ssn)) { // look for exactly 9 digits
    echo "valid";
} else {
    echo "invalid";
}

答案 4 :(得分:0)

这是我用来验证SSN并正确格式化的,这绝不会失败:

function check_ssn($ssn){
    $clean_ssn = preg_replace("/[^0-9,.]/", "", $ssn);
    $formatted_ssn = preg_replace("/^(\d{3})(\d{2})(\d{4})$/", "$1-$2-$3", $clean_ssn);
    // echo $formatted_ssn;
    if (preg_match ('/^\d{3}-\d{2}-\d{4}$/', $formatted_ssn)){
        $result = 1;
    } else $result = 0;
    return $result;
}