2013-08-27 71 views
-1

我注意到这件事,我不明白它是如何工作:不了解语法在JavaScript value.match

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}$/))

+1

您是否搜索[match](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/match)? –

回答

0

这是一个正则表达式:)你检查引脚是3或4位数字。 你可以了解更多关于正则表达式here

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),并没有别的(因为$^在beggining和结束”

例如:

  • /^\d{3}$/符合条件:123,但不匹配a123123a
  • /\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}$/))

+0

母鸡3或4个字符的任何数字应该 工作? –

+0

@ user2723065 - 是,任何数字。因此对于'\ d {3}'这意味着000-999和对于\ d {4}' - 0000-9999。 – kamituel

1

pin是一个DOM元素,最有可能是HTMLInputElement

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

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

我也假设,你可能不知道,正则表达式做什么,所以解释:

  • ^停泊在字符串的开始和结束$匹配匹配。
  • \d是字符类[0-9]需要被精确匹配3倍(在第一测试)或4倍(第二测试)。

因此,您的字符串必须包含从开始到结束的精确3或4位数字符。


侧面说明:您的代码会更优化这样写的:

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

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

因此两者都有相同的结果,但test更适合定期模式测试。


另一种替代方案,而无需依赖于正则表达式:

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

从以前的正则表达式版本的唯一区别是,parseInt将忽略前后空白以及尾随无效字符(这应该是角落例)。这个选项更易读IMO。您可以选择更适合您的用例的解决方案。

+0

+1建议'测试' – Bergi

+0

@Bergi其实我只是想更好的东西,但谢谢! '=]' –