-1

在 javascript 中,我注意到这个我不明白它是如何工作的东西:

function validate_pin(frm)
{
    var piN = document.getElementById('codice');
    if (!piN) {
        var piN = document.getElementById('invio');
    }

    if (!piN.value.match(/^\d{3}$/) && !piN.value.match(/^\d{4}$/)) {
        // SORRY! WRONG PIN!
        //alert('ATTENZIONE! INSERIRE UN PIN NUMERICO!');
        alert('Attenzione! Codice PIN errato!');
        piN.focus();

        return false;
    }
}

和字符串if (!piN.value.match(/^\d{3}$/) && !piN.value.match(/^\d{4}$/))是什么意思?

4

3 回答 3

1

pin是一个 DOM 元素,很可能是一个HTMLInputElement.

pin.value是输入元素的值,它是一个字符串。

String.match将字符串与正则表达式(一个RegExp 对象)匹配,当没有找到匹配项时返回一个假值。

我还假设您可能不知道该正则表达式的作用,所以解释一下:

  • 锚点在字符串的^开头$匹配,在结尾匹配。
  • \d是一个字符类[0-9],需要精确匹配3时间(在第一次测试中)或4时间(第二次测试)。

因此,您的字符串必须从头到尾正好包含 3 或 4 个数字字符。


旁注:您的代码以这种方式编写会更优化:

if (!/^\d{3,4}$/.test(piN.value)) {}

regexp.test仅返回一个布尔值,指示字符串是否与模式匹配,而将在成功(强制到)或未找到匹配项时(强制到 )string.match返回匹配数组。truenullfalse

因此两者具有相同的结果,但test更适合常规模式测试。


还有另一种选择,不依赖正则表达式:

var pinValue = parseInt(pin.value, 10);
if (pinValue >= 100 && pinValue <= 9999) {}

与以前的正则表达式版本的唯一区别是parseInt它将忽略前导和尾随空格以及尾随无效字符(应该是极端情况)。此选项更具可读性 IMO。您可以选择更适合您的用例的解决方案。

于 2013-08-27T20:40:48.247 回答
0

这是一个解释:

function validate_pin(frm)
{
    // Get an input element with ID=codice
    var piN = document.getElementById('codice');

    // If there is no such element, get input with ID=invio
    if (!piN) {
        var piN = document.getElementById('invio');
    }

    // If value of this input is NOT a 3- or 4-digit number, alert with an error
    // and return false.
    if (!piN.value.match(/^\d{3}$/) && !piN.value.match(/^\d{4}$/)) {
        // SORRY! WRONG PIN!
        //alert('ATTENZIONE! INSERIRE UN PIN NUMERICO!');
        alert('Attenzione! Codice PIN errato!');
        piN.focus();

        return false;
    }
}

正则表达式/^\d{3}$/的意思是:“只有三个数字 ( \d) 的字符串(因为^在开头和$结尾处)”。

例如:

  • /^\d{3}$/匹配: 123,但不匹配a123or 123a
  • /\d{3}$/匹配:123a123,但不匹配123a
  • /^\d{3}/匹配:123123a,但不匹配a123

条件:if (!piN.value.match(/^\d{3}$/) && !piN.value.match(/^\d{4}$/))可以写成更短的形式:if (!pIN.value.match(/^\d{3,4}$/)).

于 2013-08-27T20:38:38.313 回答
0

那是一个正则表达式:) 你检查引脚是 3 位还是 4 位长。您可以在此处了解有关正则表达式的更多信息。

于 2013-08-27T20:38:20.523 回答