2015-10-22 3 views
2

у меня есть поле, где мне нужно собрать единый номерJS Regex исключить некоторые числа

<input type="text" patern="" name="number" required="required" /> 

Теперь значение может быть что угодно 1-9999 однако я некоторые цифры не позволяют, скажем

15 
21 
532 

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

+0

Сколько ложных совпадений у вас есть? Этот тип кода обычно более управляем как двухэтапный процесс, а не решение «все-в-одном». – vol7ron

ответ

2

Попробуйте это регулярное выражение:

/^(?!(?:15|21|532|0+)$)\d{1,4}$/ 

Если вы посмотрите внимательно, вы увидите, что я включил в числе 0 в запрещенном списке 15, 21, 532. Причина этого в том, что регулярное выражение соответствует любому числу, имеющему от 1 до 4 цифр, но вам нужен только диапазон 1-9999.

Нажмите приведенную ниже ссылку для запуска демо-версии этого регулярного выражения.

Regex 101

JS Fiddle

+0

Спасибо, что отлично работает. Постскриптум Я использовал заклинание ** patern ** вместо ** pattern **, поэтому ни одна из моих попыток никогда не срабатывала:/ –

+0

По какой-то причине вы не можете заставить его работать вообще, можете ли вы отправить исходный код обратно, в чем причина обновления? http://jsfiddle.net/sc79sLop/ –

+0

Исходное решение имело недостаток в том, что он блокировал _was, например, число '15', но это было _also_ блокирование' 153', '1503' и т. д. Это регулярное выражение работает на наименьшее использование Regex 101. –

0

Попробуйте установить type="submit"disabled в случае 15, 21, 532 значение input type="number", используя String.prototype.match()

var input = document.querySelector("input[type=number]") 
 
var label = document.querySelector("[for=number]"); 
 
input.oninput = function() { 
 
    var val = this.value; 
 
    var matches = ["15","21","532"]; 
 
    var match = matches.indexOf(val) !== -1; 
 
    this.nextElementSibling.disabled = match; 
 
    this.style.color = match ? "red" : "inherit"; 
 
    label.innerHTML = match ? "Invalid number: <mark style=color:red>" 
 
          + val + "</mark>" 
 
          : ""; 
 
}
<form> 
 
    <input type="number" min="1" max="9999" pattern="" name="number" required="required" id="number" /> 
 
    <input type="submit" /><br /> 
 
    <label for="number"></label> 
 
</form>

+0

Я не использую jquerry в этом проекте, у вас есть чистое решение JS? –

+0

У вашего ответа есть несколько проблем. Во-первых, ваша реализация не позволяет вводить определенные числа, содержащие числа, которые должны быть заблокированы. Например, я не могу ввести «150». Во-вторых, он на самом деле хочет заблокировать номер '0', поскольку он заявил, что хочет диапазон от 1 до 9999. –

+0

@TimBiegeleisen _« Кстати, у моего ответа также есть проблема. Вы видите, что это такое? фактически связан с проблемой, которую вы также имеете. »_ Пожалуйста, просветите – guest271314

-1
function isValidNumber(num){ 
    if (isNaN(+num)) 
    return false; 

    var cant_match = [ 15, 21, 532 ]; 
    return !(cant_match.indexOf(+num) >= 0); 
} 


// Example call 
isValidNumber(document.querySelector("input[name=number]").value); 

Довольно просто:

  • isNaN(+num) не выполняется, если значение передается функции есть нечто иное, чем реальное или целое число (например, '32 456' не удается)
  • значение, передаваемое затем проверяется против массива плохих чисел; если есть индекс> = 0, то число было найдено в массиве
+0

Но вся суть вопроса OP заключалась в том, как использовать атрибут 'pattern' для проверки и тем самым использовать механизмы проверки формы HTML5 для предотвращения отправки (а также сообщать об ошибке пользователю, хотя он не упоминал что). –

+0

@torazaburo возможно, но он указал JS и RegEx и не ответил на вопрос, который я оставил в качестве комментария к его сообщению. – vol7ron

+0

Потому что он указал атрибут 'pattern' в HTML, который он предоставил? –

Смежные вопросы