2015-06-24 2 views
0

Я пытаюсь проверить текстовое поле, чтобы убедиться, что URL-адрес написан внутри (минус часть «http: //»). Вот мой код:javascript регулярное выражение не работает

var isUrl; 
var regex = new RegExp("^(?!http)(www\.)?(([a-z])+\.[a-z]{2,}(\.[a-z]{2,})?)"); 
var siteUrl = e.target.value; 
if (siteUrl.match(regex)) { 
    isUrl = true; 
} 
else { 
    isUrl = false; 
} 

Так мое регулярное выражение ^(?!http)(www\.)?(([a-z])+\.[a-z]{2,}(\.[a-z]{2,})?). я был под впечатлением, что это будет сделать следующее:

  1. ничего не совпадают, начиная с http .. который он делает правильно
  2. Разрешить дополнительный www. в начале
  3. Принимать 1 или более символы из az, которые нужно ввести в
  4. Принять точку после этих символов
  5. Принять 2 или более символов, следующих за точкой, и
  6. Разрешить дополнительную точку, за которой следуют два или более символов.

На практике текстовое поле принимает строки типа "ashdiguasdf" и "aksjdnfa :: // ', ~", которые он не должен делать. Может ли кто-нибудь объяснить, почему?

+1

Используйте литерал регулярного выражения или двойной escape с помощью конструктора. Кроме того, вам не нужен отрицательный Lookahead, если вы привязываете свой шаблон, вы можете опустить эту часть и убедиться, что вы используете конец строки '$' anchor. – hwnd

+1

I.e. используйте 'var regex = /^(?!http)(www\.)?(([az])+\.[az]{2,}(\.[az]{2,})?)/i; '(Я думаю, что здесь требуется нечувствительность к регистру, поэтому я добавил'/i'). –

+0

Это для очень специфических URL-адресов? Не разрешены ли URL-адреса без цифр? Проверьте это: URL-адрес повторно является более сложным, чем ожидалось: http://stackoverflow.com/questions/161738/what-is-the-best-regular-expression-to-check-if-a-string-is-a -valid-url –

ответ

2

Основная проблема заключается в том, что вы используете символ \ в цитируемой строке, которую javascript будет интерпретировать как начало «управляющего символа» (например, \n для новой строки и т. Д.).

Один из вариантов заключается в том, чтобы избежать его, заменив \ на \\.

Но самым простым решением является использовать следующий формат ...

var regex = new RegExp(/^(?!http)(www\.)?(([a-z])+\.[a-z]{2,}(\.[a-z]{2,})?)/); 

Это также позволяет сделать его чувствительно к регистру (если вы хотите), используя i символ в конце, как это. ..

var regex = new RegExp(/^(?!http)(www\.)?(([a-z])+\.[a-z]{2,}(\.[a-z]{2,})?)/i); 

в качестве дополнительного бита, вы используете более capture groups, чем это действительно необходимо. Ваше выражение также может быть написано так же с тем же результатом ...

^(?!http)(?:www\.)?[a-z]+(?:\.[a-z]{2,}){1,2} 
Смежные вопросы