Плагин парсера URL-адреса jQuery завершается с ошибкой '@' в строке запроса. Какое регулярное выражение парсинга URL будет работать? - PullRequest
0 голосов
/ 14 октября 2010

Фон

Я использую плагин jQuery анализатора URL от Mark Perkins для извлечения значений строки запроса из текущего URL.

Процесс синтаксического анализа завершается неудачно, когда значения строки запроса содержат символ «@», особенно когда в строке запроса есть адрес электронной почты. Это относится к последней версии плагина, взятой со страницы проекта github сегодня.

Рабочие и нерабочие примеры

Процесс анализа заполняет внутренний объект parsed.queryKey парами ключ: значение из строки запроса.

Предлагается два режима: «свободный» и «строгий». Оба возвращают один и тот же результат.

// Parse URL that works
jQuery.url.setUrl("http://example.com/?email=example.example.com");

// Examine result
parsed.queryKey = {
    'email':'example.example.com'
}


// Parse URL that fails
jQuery.url.setUrl("http://example.com/?email=example@example.com");

// Examine result
parsed.queryKey = {
}

Задача

Я бы хотел иметь возможность изменить одно (или оба) регулярных выражений, чтобы решить проблему сбоя при разборе аргументов строки запроса при наличии символа '@'.

Парсер использует регулярные выражения для извлечения информации из URL. Они определены (что сейчас) строка 27 :

parser: {
    strict: /^(?:([^:\/?#]+):)?(?:\/\/((?:(([^:@]*):?([^:@]*))?@)?([^:\/?#]*)(?::(\d*))?))?((((?:[^?#\/]*\/)*)([^?#]*))(?:\?([^#]*))?(?:#(.*))?)/, //less intuitive, more accurate to the specs
    loose: /^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/)?((?:(([^:@]*):?([^:@]*))?@)?([^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/ // more intuitive, fails on relative paths and deviates from specs
}

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

Как я могу изменить регулярные выражения, чтобы позволить процессу синтаксического анализа работать, когда в строке запроса присутствует '@'?

Ответы [ 2 ]

1 голос
/ 15 октября 2010

Использование encodeURIComponent

var url = "http://example.com/?email=";
var email = encodeURIComponent("example@example.com");
jQuery.url.setUrl(url + email);

Это заменит @ на% 40.

наслаждайтесь!

0 голосов
/ 14 октября 2010

Обновление:

Используя Regex Coach Я прошел и могу сделать это внушительное выражение:

^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/)?((?:(([^:]*):?([^:@]*))?@)?([^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)

еще одна попытка:

^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/)?((?:(([^:]*):?([^:]*))?)?([^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)

Может быть, этот RegEx может быть вам полезен:

(?<protocol>(http|ftp|https|ftps):\/\/)?(?<site>[\w\-_\.]+\.(?<tld>([0-9]{1,3})|([a-zA-Z]{2,3})|(aero|arpa|asia|coop|info|jobs|mobi|museum|name|travel))+(?<port>:[0-9]+)?\/?)((?<resource>[\w\-\.,@^%:/~\+#]*[\w\-\@^%/~\+#])(?<queryString>(\?[a-zA-Z0-9\[\]\-\._+%\$#\~',/]*=[a-zA-Z0-9\[\]\-\._+%\$#\~',/]*)+(&[a-zA-Z0-9\[\]\-\._+%\$#\~',/]*=[a-zA-Z0-9\[\]\-\._+%\$#\~',/]*)*)?)?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...