2011-07-12 6 views
1

Я пытаюсь использовать RegEX для соответствия шаблону URL. Я нашел ответ здесь: Check if a Javascript string is a urlИспользование RegEX для сопоставления шаблона URL, недопустимый квантификатор?

который указал мне здесь: http://forums.devshed.com/javascript-development-115/regexp-to-match-url-pattern-493764.html

Который дал мне следующий код (вырезать и вставить из devshed сюда и мой сценарий):

function ValidURL(str) { 
    var pattern = new RegExp('^(https?:\/\/)?'+ // protocol 
     '((([a-z\d]([a-z\d-]*[a-z\d])*)\.)+[a-z]{2,}|'+ // domain name 
     '((\d{1,3}\.){3}\d{1,3}))'+ // OR ip (v4) address 
     '(\:\d+)?(\/[-a-z\d%_.~+]*)*'+ // port and path 
     '(\?[;&a-z\d%_.~+=-]*)?'+ // query string 
     '(\#[-a-z\d_]*)?$','i'); // fragment locater 
    if(!pattern.test(str)) { 
     alert("Please enter a valid URL."); 
     return false; 
    } else { 
     return true; 
    } 
} 

Когда я пытаюсь использовать его в Firefox 4.0, Firebug 1.7.3 дает мне недопустимую ошибку квантора в:

 '(\#[-a-z\d_]*)?$','i'); // fragment locater 

Есть ли у кого-нибудь идея о том, что может быть проблемой?

Из других запросов на недопустимый квантификатор, я считаю, что * является проблемой, но не уверен, что это может быть. Строка в вопросе, который я использую функцию, когда она дает мне ошибку является:

htp://localhost:1987/ 

ADDED К.П затруднительным предложил агент-J, по меньшей мере удалена недопустимый вопрос кванторного. пальцы

Однако, это не нравится образец URL выше, когда все сделано правильно:

http://localhost:1987/ 

вопрос с портом. Когда я удаляю порт #, ему нравится localhost.

+1

Одна из вещей, вам нужно будет указать, что когда вы формируете регулярное выражение из таких строк, вещи, которые вам нужно процитировать, * разные * t han, когда вы создаете регулярное выражение с регулярным синтаксисом регулярного выражения. В частности, вам не нужно «\» перед вашими символами «/», но вы должны * * * * * * * символам перед тем, как «d» или «?». – Pointy

+1

Также номер строки ошибки, вероятно, не интересен, так как фактическая ошибка не будет обнаружена до тех пор, пока не будет вызвана функция «RegExp()», и выражение будет проанализировано. Вероятно, проблема не в том, что последняя часть регулярного выражения. – Pointy

+0

@Pointy, очень хорошая точка об ошибке, не указывая правильное место. –

ответ

0

Вам нужно бежать первый \ здесь:

'(\?[;&a-z\d%_.~+=-]*)?' 

становится

'(\\?[;&a-z\d%_.~+=-]*)?' 
+0

Это избавило от недопустимого квантификатора. Теперь он не примет примерную строку выше:/ –

+0

Я не уверен, что еще не так с вашим регулярным выражением, но, как минимум, регулярное выражение в настоящее время требует либо IPv4-адреса, либо суффикса домена (.com, .net, .us) и т. д. В этом что-то не так, но я не могу на нее наложить. –

+0

** Все ** обратных косых котировок в регулярном выражении * except * для тех, которые перед символами «/» должны быть удвоены. – Pointy

3

Я использую это, и это, кажется, работает нормально:

var re = /^(http[s]?:\/\/){0,1}(www\.){0,1}[a-zA-Z0-9\.\-]+\.[a-zA-Z]{2,5}[\.]{0,1}/; 
var isUrl = re.test(message); 
+0

не работает для 'http: // .. com' –

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