Подтвердить что ты не робот

Подтвердите номер телефона, используя javascript

Я пытаюсь проверить номер телефона, например 123-345-3456 и (078)789-8908, используя JavaScript. Вот мой код

function ValidateUSPhoneNumber(phoneNumber) {
  var regExp = /^(\([0-9]{3}\) |[0-9]{3}-)[0-9]{3}-[0-9]{4}/;
  var phone = phoneNumber.match(regExp);
  if (phone) {
    alert('yes');
    return true;
  }
  alert('no');
  return false;
}

Я тестирую функцию, используя ValidateUSPhoneNumber('123-345-34567'), которая имеет 5 цифр перед последним дефисом, который является недопустимым в соответствии с регулярным выражением. Но функция возвращает true. Может ли кто-нибудь объяснить, почему?

4b9b3361

Ответ 1

JavaScript для подтверждения номера телефона:

function phonenumber(inputtxt) {
  var phoneno = /^\(?([0-9]{3})\)?[-. ]?([0-9]{3})[-. ]?([0-9]{4})$/;
  if(inputtxt.value.match(phoneno)) {
    return true;
  }
  else {
    alert("message");
    return false;
  }
}

Ответ 2

Это регулярное выражение /^(\([0-9]{3}\)\s*|[0-9]{3}\-)[0-9]{3}-[0-9]{4}$/ проверяет все следующее:

'123-345-3456';
'(078)789-8908';
'(078) 789-8908'; // Note the space

Чтобы разбить то, что происходит:

Regular expression visualization

  • Группа в начале проверяет два пути: (XXX) или XXX-, с необязательными пробелами после закрывающей скобки.
  • Часть после проверки группы XXX-XXX

Ответ 3

может кто-нибудь объяснить, почему

потому что ваше регулярное выражение соответствует вводу. Это просто, что вход также включает дополнительные символы. Вы включили "^" , чтобы обозначить начало строки, но (как сказал Энди) вы должны включить "$" , чтобы обозначить конец строки.

Если вы запустите свое регулярное выражение с помощью "^" и закончите его "$" , тогда он будет соответствовать только строкам, которые соответствуют вашему регулярному выражению.

Запустив ваше регулярное выражение с помощью "^" и не закончив его "$" , вы сопоставляете строки, которые начинаются с последовательности, соответствующей вашему регулярному выражению, но строки могут иметь что-то еще, затягивающее соответствующую последовательность.

Ответ 5

Может ли кто-нибудь объяснить, почему?

Это происходит потому, что ваше регулярное выражение не заканчивается каким-либо метасимволом якоря, таким как конец строки $ или граница слова \b.

Поэтому, когда вы задаете движок регулярного выражения, является ли 123-345-34567 действительным номером телефона, он попытается найти совпадение в этой строке, поэтому он соответствует 123- с этой частью (\([0-9]{3}\) |[0-9]{3}-), тогда он соответствует 345- с этой частью [0-9]{3}-, то он соответствует 3456 с этой частью [0-9]{4}.

Теперь движок обнаруживает, что он прошел все регулярное выражение и нашел строку внутри вашего ввода, которая соответствует регулярному выражению, хотя символ остался - номер 7- во входной строке, поэтому он останавливается и возвращает успех, потому что он обнаружил подстрокой, которая соответствует.

Если вы включили $ или \b в конец своего регулярного выражения, движок работает так же, как раньше, он пытается сопоставить $ или \b, но находит последнее число - 7 - и это не граница слова \b, ни конец строки $, поэтому он останавливается и не находит совпадения.

Ответ 6

^(\(?[0-9]{3}\)?)((\s|\-){1})?[0-9]{3}((\s|\-){1})?[0-9]{4}$

Предполагая, что вы проверяете номера телефонов в США, это будет делать трюк.

Сначала мы разрешаем 0 или 1 открытые круглые скобки запускать \(?

Затем мы разрешаем 3 последовательных цифры между 0-9 [0-9]{3}

После этого мы повторяем первый шаг и допускаем 0 или 1 закрывающие круглые скобки \)?

Для второй группировки мы начинаем с разрешения пробела или дефиса 0 или 1 раза ((\s|\-){1})?

Это повторяется между второй и третьей группировкой чисел, и мы проверяем 3 последовательные цифры, а затем четыре последовательные цифры, чтобы закончить его. Для телефонных номеров в США я думаю, что это охватывает основы для разных способов, которыми люди могли форматировать номер, но достаточно ограничительный, чтобы они не могли передать необоснованную строку.

Ответ 7

Это самый простой способ найти javascript regex для проверки формата номера телефона. этот конкретный пример проверяет, является ли это 10-значным номером.

<input name="phone" pattern="^\d{10}$" type="text" size="50">

Поле ввода получает флажок при нажатии кнопки отправки, если шаблон не соответствует значению, не требуется никаких других css или js.

Ответ 8

Добавьте границу слова \b в конец регулярного выражения:

/^(\([0-9]{3}\) |[0-9]{3}-)[0-9]{3}-[0-9]{4}\b/

если пробел после ) является необязательным:

/^(\([0-9]{3}\)\s*|[0-9]{3}-)[0-9]{3}-[0-9]{4}\b/

Ответ 9

Добавьте $в конец регулярного выражения, чтобы обозначить конец шаблона:

var regExp = /^(\([0-9]{3}\)\s?|[0-9]{3}-)[0-9]{3}-[0-9]{4}$/;

Ответ 10

function validatePhone(inputtxt) {
  var phoneno = /^\(?([0-9]{3})\)?[-. ]?([0-9]{3})[-. ]?([0-9]{4})$/;
  return phoneno.test(inputtxt)
}

Ответ 11

Если вы используете тег ввода, который этот код вам поможет. Я пишу этот код самостоятельно, и я думаю, что это очень хороший способ использования в качестве входных данных. но вы можете изменить его, используя свой формат. Это поможет пользователю исправить свой формат на теге ввода.

$("#phone").on('input', function() {  //this is use for every time input change.
        var inputValue = getInputValue(); //get value from input and make it usefull number
        var length = inputValue.length; //get lenth of input

        if (inputValue < 1000)
        {
            inputValue = '1('+inputValue;
        }else if (inputValue < 1000000) 
        {
            inputValue = '1('+ inputValue.substring(0, 3) + ')' + inputValue.substring(3, length);
        }else if (inputValue < 10000000000) 
        {
            inputValue = '1('+ inputValue.substring(0, 3) + ')' + inputValue.substring(3, 6) + '-' + inputValue.substring(6, length);
        }else
        {
            inputValue = '1('+ inputValue.substring(0, 3) + ')' + inputValue.substring(3, 6) + '-' + inputValue.substring(6, 10);
        }       
        $("#phone").val(inputValue); //correct value entered to your input.
        inputValue = getInputValue();//get value again, becuase it changed, this one using for changing color of input border
       if ((inputValue > 2000000000) && (inputValue < 9999999999))
      {
          $("#phone").css("border","black solid 1px");//if it is valid phone number than border will be black.
      }else
      {
          $("#phone").css("border","red solid 1px");//if it is invalid phone number than border will be red.
      }
  });

    function getInputValue() {
         var inputValue = $("#phone").val().replace(/\D/g,'');  //remove all non numeric character
        if (inputValue.charAt(0) == 1) // if first character is 1 than remove it.
        {
            var inputValue = inputValue.substring(1, inputValue.length);
        }
        return inputValue;
}

Ответ 12

Вот как я это делаю.

function validate(phone) {
    const regex = /^\(?([0-9]{3})\)?[-. ]?([0-9]{3})[-. ]?([0-9]{4})$/;
    return regex.test(phone)
}

А потом,

validate('1234567890')     // true
validate(1234567890)       // true
validate('(078)789-8908')  // true
validate('123-345-3456')   // true

Ответ 13

/^1?\s?(\([0-9]{3}\)[- ]?|[0-9]{3}[- ]?)[0-9]{3}[- ]?[0-9]{4}$/

Это будет проверять все номера в стиле США, с или без 1, а также с круглой скобкой или без нее для кода города (но если используется, используется правильно. IE (902-455-4555 не будет работать, так как нет закрывающей скобки. Это также позволяет или - или пробел между множествами, если требуется.) Это будет работать для примеров, предоставленных op.