使用 11 检查荷兰 BSN 验证文本字段

Posted

技术标签:

【中文标题】使用 11 检查荷兰 BSN 验证文本字段【英文标题】:Validate textfield with 11 check for Dutch BSN 【发布时间】:2021-05-23 08:36:44 【问题描述】:

我在 Wordpress 网站上使用 CF7,并想验证一个文本字段是否包含 9 位数字并使用所谓的 11-check。这是一种验证荷兰 SSN (BSN) 的算法。

它的工作原理是这样的:

假设我们对 BSN 123456782 执行 11 次检查

1st digit = 1, 9 * 1 = 9
2nd digit = 2, 8 * 2 = 16
3rd digit = 3, 7 * 3 = 21
4th digit = 4, 6 * 4 = 24
5th digit = 5, 5 * 5 = 25
6th digit = 6, 4 * 6 = 24
7th digit = 7, 3 * 7 = 21
8th digit = 8, 2 * 8 = 16
9th digit = 2, -1 * 2 = -2 (last digit is not added but subtracted)
 
Total is 154
 

因为 154 可以除以 11,而且它是一个 9 位数字,我们可以假设它是一个有效的 BSN(154/11=14)。

我认为这可以通过 <script></script> 以及一些 jQuery 来完成。 我还在Github 上找到了这个(部分)代码,我认为这很有用,但我对此很陌生,所以希望有人可以帮助我。

function addLeadingZerosToBSN(bsn) 
    return ("000000000" + bsn).slice(-9);


function getSumBSN(bsn) 

  var a = parseInt(bsn[0])*9;
  var b = parseInt(bsn[1])*8;
  var c = parseInt(bsn[2])*7;
  var d = parseInt(bsn[3])*6;
  var e = parseInt(bsn[4])*5;
  var f = parseInt(bsn[5])*4;
  var g = parseInt(bsn[6])*3;
  var h = parseInt(bsn[7])*2;
  var i = parseInt(bsn[8])*-1;

  var sum = a+b+c+d+e+f+g+h+i;
  return sum;


function isValidBSN(bsn) 
  bsn = addLeadingZerosToBSN(bsn);

 
  if (getSumBSN(bsn) % 11) 
    return false;
   else 
    return true;
  

找到此代码,但它不适用于 CF7:

function check_bs()

var fieldRequired = Array("extra_1", "extra_2", "extra_3", "extra_4", "extra_5");
var alertMsg = "De volgende BS-nummers zijn niet correct:\n";
var l_Msg = alertMsg.length;

// loopje van de ingevulde velden
for (var i = 0; i < fieldRequired.length; i++)

bsnr=formobj.elements[fieldRequired[i]];
checksum=0;

// check cijfers
if(isNaN(bsnr) || bsnr.length!=9)
alertMsg += i + ". (te kort)" + "\n"

// check elfproef 
else
for(i=0;i<8;i++)
checksum += (bsnr.charAt(i)*(9-i));

checksum -= bsnr.charAt(8);

// ongeldig nummer
if(checksum%11!=0)
alertMsg += i + ". (ongeldig)" + "\n"





if (alertMsg.length == l_Msg)
return true;
 else 
alert(alertMsg);
return false;


提前致谢。

瓦斯科

【问题讨论】:

我找到了这段代码,但它不适用于 CF7。我将其添加到原始问题中。谁能帮我解决这个问题? 有人请吗?我被卡住了…… 【参考方案1】:

我已经设法回答了我自己的问题。希望这对将来的某人有所帮助。它适用于使用“十一检查”的所有内容。

我的代码:

add_filter( 'wpcf7_validate_text*', 'bsn_field_validation', 20, 2 );
function bsn_field_validation($result, $tag ) 

$fields_to_validate = [
    'field-name'
];

if ( in_array($tag->name, $fields_to_validate) ) 

$bsn_number = isset( $_POST[$tag->name] ) ? trim( $_POST[$tag->name] ) : '';

    if (strlen($bsn_number) != 9 ) 
        $result->invalidate( $tag, "Field not valid!" );
        return $result;
    

    $number = str_split($bsn_number);

    $bsn_counter = 0;
    $sum = 0;
    for ( $i = 9; $i >= 1 ; $i--) 
        if ($i == 1) 
            $sum = $sum - ($number[$bsn_counter] * $i);
         else 
            $sum = $sum + ($number[$bsn_counter] * $i);
        
        
        $bsn_counter++;
    

    if ($sum % 11 != 0) 
        $result->invalidate( $tag, "Field not valid!" );
        return $result;
    
    return $result;
  
  return $result;
  

add_action( 'wp_footer', 'validate_cf7_bsn_field' );
function validate_cf7_bsn_field() 
?>
<script>

jQuery(document).ready(function($) 

    const fieldsToValidate = [
        'field-name'
    ];

    fieldsToValidate.forEach(function(v, i) 
        $('input[name="' + v + '"]').on('blur', function() 
            const bsnNumber = $(this).val().trim();
            $(this).removeClass('wpcf7-not-valid');
            $(this).parent().find('.wpcf7-not-valid-tip').remove();
            if (bsnNumber.length != 9) 
                $(this).addClass('wpcf7-not-valid');
                $(this).parent().append('<span class="wpcf7-not-valid-tip" aria-hidden="true">Field not valid!</span>');
                return false;
             else if (Number(bsnNumber) == NaN) 
                $(this).addClass('wpcf7-not-valid');
                $(this).parent().append('<span class="wpcf7-not-valid-tip" aria-hidden="true">Field not valid!</span>');
                return false;
            

            bsnCounter = 0;
            sum = 0;
            for ( i = 9; i >= 1 ; i--) 
                if (i == 1) 
                    sum = sum - (bsnNumber[bsnCounter] * i);
                 else 
                    sum = sum + (bsnNumber[bsnCounter] * i);
                
                
                bsnCounter++;
            

            if (sum % 11 != 0) 
                $(this).addClass('wpcf7-not-valid');
                $(this).parent().append('<span class="wpcf7-not-valid-tip" aria-hidden="true">Field not valid!</span>');
             else 
                $(this).removeClass('wpcf7-not-valid');
                $(this).parent().find('.wpcf7-not-valid-tip').remove();
            
        );
    );
    
);
</script>

<?php

如果您想在同一(或网站上的其他表单)中添加更多字段进行验证,您只需在$fields_to_validate = [ 下方的第一个字段下方添加额外的字段名称,在const fieldsToValidate = [ 下方添加相同的字段名称。

假设您想要验证 3 个字段。它现在说:

$fields_to_validate = [
    'field-name'

改成:

$fields_to_validate = [
    'field-name'
    'second-field-name',
    'third-field-name',

对于const fieldsToValidate = [,您需要以相同的方式添加这些字段名称:

const fieldsToValidate = [
    'field-name',
    'second-field-name',
    'third-field-name'

【讨论】:

以上是关于使用 11 检查荷兰 BSN 验证文本字段的主要内容,如果未能解决你的问题,请参考以下文章

项目简章BSN DBA荷兰商学院工商管理博士项目 | 加入BSN,探索管理新高度

为啥我无法在 Swift 的登录按钮中验证 textFields

验证检查文件单击android中的按钮

仅当字段不为空时才进行电子邮件验证

文本字段中的 jquery 验证

使用 RxSwift 和 RXCocoa 验证按钮单击时的所有文本字段