Комментарии 60
typeof( param1 )

Это не очевидный момент, но typeof — это унарный оператор, а не функция. То есть скобки в данном случае не нужны и их можно опустить.
Так читается лучше, ну по крайней мере на мой взгляд. Это уже из оперы coding standards — у каждого свои тараканы.
Не припомню ни в одном coding standard для JS такого правила. И они как раз создаются, чтобы тараканы были общие:)
так-то можно развернуть холивары на тему

function(){
}

и

function()
{
}


Ну или
if($case1)
    return 1;
else
    return 2;

и

if($case1){
    return 1;
} else{
    return 2;
}


Я это к тому, что по какому ману/гайду учился — так и пишешь на протяжении долгого-долгого времени, покуда не появится таск «Переучиться»
А я так вообще зеленый, воспоминания о первом учебнике слишком свежи%) А по сему к первому комменту — впитал, усвоил, исправлюсь =)
"* т.е. схема может быть и не указана."
То есть схем может быть сколько угодно?)
ну… если криво указать начальный урл — например https://http://habrahabr.ru/post/232073/
регулярка обработает его как http://habrahabr.ru/post/232073/, т.е. учтет последнюю схему. А насчет сколько угодно — завтыкал, каюсь. Доберусь до контупера — поправлю.
Сделаю валидацию всех свойств.
>([a-z0-9][a-z0-9_\-\.]+) — HOST, насколько я знаю, начинаться доменное имя может только с буквы/цифры, а дальше уже могут идти и — и _ и. Более того, не бывает доменных имен короче 6 символов, но ведь ссылки то бывают и внутрисетевые, где хостнеймами как хочешь так и рулишь, та что сойдет и 1+ символ.

«яндекс.рф» под вашу регулярку не подходит, в другой статье регулярка удачнее, с поддержкой IDN.
ya.ru — домен из 5 символов, непонятно, почему вы считаете, что короче 6 не бывает.
Насчет 6 — обсчитался, дело было в 4 утра, математика начала подводить. 2 + 2 + точка почему-то посчитал 6%)

Насчет IDN — ну вот тут не сказать что не знал об этом… Я их не признаю, вообще никак..рф за домен не считаю. Может эта точка зрения неверна, но осталась она еще с тех времен когда в seo работал, тогда они только появились и вообще не продвигались.ну да не о том речь!
Коли надо — сделаем.
хохо. а вот этого не знал. на практике не встречал такие короткие. чисто для теста забил b.com/ — выдало dnserror, забил на это дело. что ж, будем знать.
НЛО прилетело и опубликовало эту надпись здесь
да и i.ua не только рабочий, но весьма раскрученный в Украине, еще и почта халявная на этом домене висит.
Это другое. t.co — серверсайд сервис шортлинков.
Здесь же задача на стороне клиента, без общения с сервером — обрабатывать ссылки.

Сейчас я переписываю все.
Тут, к сожалению, я не могу сказать вообще ничего. Ибо с нодой дела пока не имел, не до нее.
Таск был именно с тем что есть( JS ) сделать.
Регулярка не работает с URL вида
//habr.ru

Такое часто нужно, когда требуется, чтобы ресурс подгружался с той же schema, что и сама страничка.
Таким образом происходит загрузка JavaScript библиотек с CDN.
Возможно кому-нибудь понадобится: URI.js — лучшая библиотека из тех, что я видел для работы с URI на JS.
Из плюсов можно отменить:
  1. Xорошая документация
  2. Обработка сложных случаев
  3. Модульность
  4. Нет зависимостей от других библиотек
  5. Есть плагин для jQuery

И вот тут появляется дилемма. Написать все то же самое только самому или перейти на эту либу %)
Есть еще вариант написать все то же самое самому но в продакшн взять эту либу.
ну это неуважение к себе самому получается=)
Написать то же самое и не использовать.
[жалуюсь] В любом браузере есть внутренние классы, которые предназначены для разбора URL и для обратного составления строки с адресом. Почему не добавить в стандартную библиотеку JavaScript нормальный API для работы с URI? Такое ощущение, что авторам браузеров намного важнее реализовать 3D графику с аппаратным ускорением, чем добавить один единственный класс для нормальной работы с URL. В результате имеем несколько разных pure-JavaScript библиотек, которые не всегда попадают в спецификацию, и работают заведомо медленней, чем нативная реализация. [/жалуюсь]
Спасибо автору за очень полезную библиотеку. А почему нет ссылки на Github/Bitbucket репозиторий?
А зачем юзать один windows.location, когда можно просто создать:
var el = document.createElement('a');
el.href = 'http://habrahabr.ru/post/232073/#comment_7837811';
alert(el.pathname); // '/post/232073/'
Опередили, тоже хотел автору предложить этот способ))) у ссылки только нет query, но всё решается применением split к el.search.
Вот примерно так можно из el.search получить query:
var query = {};

'?sd=fdg&fd=&&sd=8'.substring(1).split('&').forEach(function(value) {
    value = value.split('=');

    if (value[0] in query) {
        if (!(query[value[0]] instanceof Array))
            query[value[0]] = [query[value[0]]];

        query[value[0]].push(value[1]);
    } else
        query[value[0]] = value[1];
});

query;

Написал так, чтобы в консоль можно было вставить и сразу проверить.
Про document.createElement('a') — знал, но не хотелось использовать этот способ. Сейчас не вспомню но что-то было с этим способом не так.
да я его только в 1 месте использую, для перехода по сгенерированному URL
	go: function(){
		if(!this.data.scheme && this.data.host)
			this.data.scheme = 'http';
		
		window.location.href = this.update().url;
	}


Или вы в принципе про использование document.createElement('a') вместо window.location?
Да причем здесь вообще location, там просто находятся данные по текущему урлу страницы и методы для перехода на другую.

А document.createElement('a') создает элемент ссылки, который прекрасно может распарсить урл именно так как сделал бы браузер, зачем делать то что уже продумано людьми, которые создавали браузер.

Да и вам следует почитать теории, потому то странно сравнивать такие вещи, если вы к примеру установить у location свойство pathname то перейдете на другую страницу, а если это же свойство установить ссылке, то никуда вы не перейдете, а спокойно сможете взять получившийся урл из свойства href ссылки.
Ну это ясное дело что переход по ссылке будет.

И самая большая проблема заключается как раз в том, что каждый разработчик, делая свой браузер «Делает свой интернет» и что работает в одном — не факт что будет работать в другом, а если и будет работать не обязательно будет работать так же. Примеров весь инет.

Собственно это и есть причина моего нежелания использовать document.createElement('a')
Только делая очередную библиотеку, вы делаете очередной «свой интернет», со своими глюками. Поэтому, странно, не полагаться на логику парсинга URL браузером, но при этом полагаться на логику регулярных выражений, предоставляемых тем же браузером. Да и вообще, с чего вы решили, что они делают эту задачу хуже, чем ваша библиотека?
Ни в коем случае не претендую на «лучшее» решение.
Просто на мой взгляд — регэксп надежнее. И это не «уперся лбом», а просто мнение, которое легко изменить любыми пруфами обратного.

Для меня это в первую очередь «спортивны интерес», а данный пост — расшаривание личного опыта, да и самого кода (что полезно, ибо что может быть лучше конструктивной критики?) который будет перепиливаться. Точнее вот прям щас он уже перепиливается.

Вот например на текущий момент я уже получил по меньшей мере альтернативный вариант парсинга урла.
Простейший пример:
var link = document.createElement('a');
link.href = 'ya.ru';
return link.hostname;
// -> 

А ваша библиотека работает только с абсолютным URL? Потому как браузер работает и с относительными ссылками тоже, и в данном случае он корректно посчитает данный пример, как указание на элемент «ya.ru» относительно текущего пути. Следует четко понять, с каким стандартом вы работаете.
Это, я бы сказал, неоднозначность.
Ибо hosthame имеет ровно ту же структуру, что и filename, например,, и достоверно по неполному/неправильному линку не всегда можно определить домен это или путь.

В текущем случае, ya.ru, по-правилам, является filename, т.е. относительной ссылкой на файл ya.ru лежащий в той же директории.
НО! я то например подразумевал домен, в данном случае.

как обрабатывать такие непонятки — пока не определился.
Стоп-стоп, неоднозначности здесь нет: «ya.ru» — вполне корректный относительный адрес, и если ваша библиотека поддерживает RFC{№ лень искать} относительных URI, то тут однозначно ya.ru — это pathname.
Некорректность тут может быть, если вы поддерживаете другой стандарт, который не предполагает относительных ссылок, т. к. «ya.ru» — это неправильный формат для URL, и минимально, он должен быть "//ya.ru", чтобы трактовать его как hostname. То что вы подразумеваете «ya.ru» как домен, вы лишь подразумеваете исходя из знакомого наименования и не следуя стандартам. Следует поменять немного строку на «index.html», и вы уже будете подразумевать из логики совершенно противоположное.
Совершенно верно.

Неоднозначность я имел в виду — по RFC 1738 это path, но я то имел в виду домен.
А если я укажу строку index.com, ресурса такого я не помню, но однако видя .com лично я воспринимаю ее как домен, а некоторые воспримут его как исполняемый windows файл.

Неоднозначность как раз в том, что нельзя выдернуть некий линк ( даже не полный, не являющийся линком по RFC ) из контекста и однозначно сказать домен это или путь.

Я то предполагал мочь обрабатывать всё.
Если попытаться подытожить, то реализации поддержки методов для работы с URL в браузерах есть (или планируется) в:

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

Вообще достаточно легко найти даже на Github множество либ для работы с URL. Вот к примеру Polymer/URL, тут небольшой список, и множество других.
Ну там часть для ноды.

А так, как я уже говорил — основной интерес в том, чтобы сделать самому. Хоть на текущий момент я уже и знаю по меньше мере 4-5 библиотек.
Прежде чем выкладывать код в открытый доступ, причесали бы его для приличия, да узнали бы как работает `delete`:

26 warnings
26 warnings
 7	Redefinition of 'URL'.
 207	The body of a for in should be wrapped in an if statement to filter unwanted properties from the prototype.
 248	Variables should not be deleted.
 261	Variables should not be deleted.
 274	Variables should not be deleted.
 287	Variables should not be deleted.
 300	Variables should not be deleted.
 313	Variables should not be deleted.
 326	Variables should not be deleted.
 339	Variables should not be deleted.
 352	Variables should not be deleted.

Two undefined variables
 196	param
 197	param
 197	param
 244	result
 246	result
 250	result
 257	result
 259	result
 263	result
 270	result
 272	result
 276	result
 283	result
 285	result
 289	result
 296	result
 298	result
 302	result
 309	result
 311	result
 315	result
 322	result
 324	result
 328	result
 335	result
 337	result
 341	result
 348	result
 350	result
 354	result

По мимо этого, такие утилитарные вещи, обязательно нужно покрывать тестами, чтобы они не падали от простого URL:
var url1 = "//domain.com/path/to.html";
var url2 = "http://domain.com/path/to.html?foo=%";

На вскидку:

Regular Expression for matching Urls as in the RFC
In search of the perfect URL validation regex
RFC 3987
URI.js
Unicode regular expressions
url3.pl

Правильная регулярка
(?:http://(?:(?:(?:(?:(?:[a-zA-Z\d](?:(?:[a-zA-Z\d]|-)*[a-zA-Z\d])?)\.
)*(?:[a-zA-Z](?:(?:[a-zA-Z\d]|-)*[a-zA-Z\d])?))|(?:(?:\d+)(?:\.(?:\d+)
){3}))(?::(?:\d+))?)(?:/(?:(?:(?:(?:[a-zA-Z\d$\-_.+!*'(),]|(?:%[a-fA-F
\d]{2}))|[;:@&=])*)(?:/(?:(?:(?:[a-zA-Z\d$\-_.+!*'(),]|(?:%[a-fA-F\d]{
2}))|[;:@&=])*))*)(?:\?(?:(?:(?:[a-zA-Z\d$\-_.+!*'(),]|(?:%[a-fA-F\d]{
2}))|[;:@&=])*))?)?)|(?:ftp://(?:(?:(?:(?:(?:[a-zA-Z\d$\-_.+!*'(),]|(?
:%[a-fA-F\d]{2}))|[;?&=])*)(?::(?:(?:(?:[a-zA-Z\d$\-_.+!*'(),]|(?:%[a-
fA-F\d]{2}))|[;?&=])*))?@)?(?:(?:(?:(?:(?:[a-zA-Z\d](?:(?:[a-zA-Z\d]|-
)*[a-zA-Z\d])?)\.)*(?:[a-zA-Z](?:(?:[a-zA-Z\d]|-)*[a-zA-Z\d])?))|(?:(?
:\d+)(?:\.(?:\d+)){3}))(?::(?:\d+))?))(?:/(?:(?:(?:(?:[a-zA-Z\d$\-_.+!
*'(),]|(?:%[a-fA-F\d]{2}))|[?:@&=])*)(?:/(?:(?:(?:[a-zA-Z\d$\-_.+!*'()
,]|(?:%[a-fA-F\d]{2}))|[?:@&=])*))*)(?:;type=[AIDaid])?)?)|(?:news:(?:
(?:(?:(?:[a-zA-Z\d$\-_.+!*'(),]|(?:%[a-fA-F\d]{2}))|[;/?:&=])+@(?:(?:(
?:(?:[a-zA-Z\d](?:(?:[a-zA-Z\d]|-)*[a-zA-Z\d])?)\.)*(?:[a-zA-Z](?:(?:[
a-zA-Z\d]|-)*[a-zA-Z\d])?))|(?:(?:\d+)(?:\.(?:\d+)){3})))|(?:[a-zA-Z](
?:[a-zA-Z\d]|[_.+-])*)|\*))|(?:nntp://(?:(?:(?:(?:(?:[a-zA-Z\d](?:(?:[
a-zA-Z\d]|-)*[a-zA-Z\d])?)\.)*(?:[a-zA-Z](?:(?:[a-zA-Z\d]|-)*[a-zA-Z\d
])?))|(?:(?:\d+)(?:\.(?:\d+)){3}))(?::(?:\d+))?)/(?:[a-zA-Z](?:[a-zA-Z
\d]|[_.+-])*)(?:/(?:\d+))?)|(?:telnet://(?:(?:(?:(?:(?:[a-zA-Z\d$\-_.+
!*'(),]|(?:%[a-fA-F\d]{2}))|[;?&=])*)(?::(?:(?:(?:[a-zA-Z\d$\-_.+!*'()
,]|(?:%[a-fA-F\d]{2}))|[;?&=])*))?@)?(?:(?:(?:(?:(?:[a-zA-Z\d](?:(?:[a
-zA-Z\d]|-)*[a-zA-Z\d])?)\.)*(?:[a-zA-Z](?:(?:[a-zA-Z\d]|-)*[a-zA-Z\d]
)?))|(?:(?:\d+)(?:\.(?:\d+)){3}))(?::(?:\d+))?))/?)|(?:gopher://(?:(?:
(?:(?:(?:[a-zA-Z\d](?:(?:[a-zA-Z\d]|-)*[a-zA-Z\d])?)\.)*(?:[a-zA-Z](?:
(?:[a-zA-Z\d]|-)*[a-zA-Z\d])?))|(?:(?:\d+)(?:\.(?:\d+)){3}))(?::(?:\d+
))?)(?:/(?:[a-zA-Z\d$\-_.+!*'(),;/?:@&=]|(?:%[a-fA-F\d]{2}))(?:(?:(?:[
a-zA-Z\d$\-_.+!*'(),;/?:@&=]|(?:%[a-fA-F\d]{2}))*)(?:%09(?:(?:(?:[a-zA
-Z\d$\-_.+!*'(),]|(?:%[a-fA-F\d]{2}))|[;:@&=])*)(?:%09(?:(?:[a-zA-Z\d$
\-_.+!*'(),;/?:@&=]|(?:%[a-fA-F\d]{2}))*))?)?)?)?)|(?:wais://(?:(?:(?:
(?:(?:[a-zA-Z\d](?:(?:[a-zA-Z\d]|-)*[a-zA-Z\d])?)\.)*(?:[a-zA-Z](?:(?:
[a-zA-Z\d]|-)*[a-zA-Z\d])?))|(?:(?:\d+)(?:\.(?:\d+)){3}))(?::(?:\d+))?
)/(?:(?:[a-zA-Z\d$\-_.+!*'(),]|(?:%[a-fA-F\d]{2}))*)(?:(?:/(?:(?:[a-zA
-Z\d$\-_.+!*'(),]|(?:%[a-fA-F\d]{2}))*)/(?:(?:[a-zA-Z\d$\-_.+!*'(),]|(
?:%[a-fA-F\d]{2}))*))|\?(?:(?:(?:[a-zA-Z\d$\-_.+!*'(),]|(?:%[a-fA-F\d]
{2}))|[;:@&=])*))?)|(?:mailto:(?:(?:[a-zA-Z\d$\-_.+!*'(),;/?:@&=]|(?:%
[a-fA-F\d]{2}))+))|(?:file://(?:(?:(?:(?:(?:[a-zA-Z\d](?:(?:[a-zA-Z\d]
|-)*[a-zA-Z\d])?)\.)*(?:[a-zA-Z](?:(?:[a-zA-Z\d]|-)*[a-zA-Z\d])?))|(?:
(?:\d+)(?:\.(?:\d+)){3}))|localhost)?/(?:(?:(?:(?:[a-zA-Z\d$\-_.+!*'()
,]|(?:%[a-fA-F\d]{2}))|[?:@&=])*)(?:/(?:(?:(?:[a-zA-Z\d$\-_.+!*'(),]|(
?:%[a-fA-F\d]{2}))|[?:@&=])*))*))|(?:prospero://(?:(?:(?:(?:(?:[a-zA-Z
\d](?:(?:[a-zA-Z\d]|-)*[a-zA-Z\d])?)\.)*(?:[a-zA-Z](?:(?:[a-zA-Z\d]|-)
*[a-zA-Z\d])?))|(?:(?:\d+)(?:\.(?:\d+)){3}))(?::(?:\d+))?)/(?:(?:(?:(?
:[a-zA-Z\d$\-_.+!*'(),]|(?:%[a-fA-F\d]{2}))|[?:@&=])*)(?:/(?:(?:(?:[a-
zA-Z\d$\-_.+!*'(),]|(?:%[a-fA-F\d]{2}))|[?:@&=])*))*)(?:(?:;(?:(?:(?:[
a-zA-Z\d$\-_.+!*'(),]|(?:%[a-fA-F\d]{2}))|[?:@&])*)=(?:(?:(?:[a-zA-Z\d
$\-_.+!*'(),]|(?:%[a-fA-F\d]{2}))|[?:@&])*)))*)|(?:ldap://(?:(?:(?:(?:
(?:(?:[a-zA-Z\d](?:(?:[a-zA-Z\d]|-)*[a-zA-Z\d])?)\.)*(?:[a-zA-Z](?:(?:
[a-zA-Z\d]|-)*[a-zA-Z\d])?))|(?:(?:\d+)(?:\.(?:\d+)){3}))(?::(?:\d+))?
))?/(?:(?:(?:(?:(?:(?:(?:[a-zA-Z\d]|%(?:3\d|[46][a-fA-F\d]|[57][Aa\d])
)|(?:%20))+|(?:OID|oid)\.(?:(?:\d+)(?:\.(?:\d+))*))(?:(?:%0[Aa])?(?:%2
0)*)=(?:(?:%0[Aa])?(?:%20)*))?(?:(?:[a-zA-Z\d$\-_.+!*'(),]|(?:%[a-fA-F
\d]{2}))*))(?:(?:(?:%0[Aa])?(?:%20)*)\+(?:(?:%0[Aa])?(?:%20)*)(?:(?:(?
:(?:(?:[a-zA-Z\d]|%(?:3\d|[46][a-fA-F\d]|[57][Aa\d]))|(?:%20))+|(?:OID
|oid)\.(?:(?:\d+)(?:\.(?:\d+))*))(?:(?:%0[Aa])?(?:%20)*)=(?:(?:%0[Aa])
?(?:%20)*))?(?:(?:[a-zA-Z\d$\-_.+!*'(),]|(?:%[a-fA-F\d]{2}))*)))*)(?:(
?:(?:(?:%0[Aa])?(?:%20)*)(?:[;,])(?:(?:%0[Aa])?(?:%20)*))(?:(?:(?:(?:(
?:(?:[a-zA-Z\d]|%(?:3\d|[46][a-fA-F\d]|[57][Aa\d]))|(?:%20))+|(?:OID|o
id)\.(?:(?:\d+)(?:\.(?:\d+))*))(?:(?:%0[Aa])?(?:%20)*)=(?:(?:%0[Aa])?(
?:%20)*))?(?:(?:[a-zA-Z\d$\-_.+!*'(),]|(?:%[a-fA-F\d]{2}))*))(?:(?:(?:
%0[Aa])?(?:%20)*)\+(?:(?:%0[Aa])?(?:%20)*)(?:(?:(?:(?:(?:[a-zA-Z\d]|%(
?:3\d|[46][a-fA-F\d]|[57][Aa\d]))|(?:%20))+|(?:OID|oid)\.(?:(?:\d+)(?:
\.(?:\d+))*))(?:(?:%0[Aa])?(?:%20)*)=(?:(?:%0[Aa])?(?:%20)*))?(?:(?:[a
-zA-Z\d$\-_.+!*'(),]|(?:%[a-fA-F\d]{2}))*)))*))*(?:(?:(?:%0[Aa])?(?:%2
0)*)(?:[;,])(?:(?:%0[Aa])?(?:%20)*))?)(?:\?(?:(?:(?:(?:[a-zA-Z\d$\-_.+
!*'(),]|(?:%[a-fA-F\d]{2}))+)(?:,(?:(?:[a-zA-Z\d$\-_.+!*'(),]|(?:%[a-f
A-F\d]{2}))+))*)?)(?:\?(?:base|one|sub)(?:\?(?:((?:[a-zA-Z\d$\-_.+!*'(
),;/?:@&=]|(?:%[a-fA-F\d]{2}))+)))?)?)?)|(?:(?:z39\.50[rs])://(?:(?:(?
:(?:(?:[a-zA-Z\d](?:(?:[a-zA-Z\d]|-)*[a-zA-Z\d])?)\.)*(?:[a-zA-Z](?:(?
:[a-zA-Z\d]|-)*[a-zA-Z\d])?))|(?:(?:\d+)(?:\.(?:\d+)){3}))(?::(?:\d+))
?)(?:/(?:(?:(?:[a-zA-Z\d$\-_.+!*'(),]|(?:%[a-fA-F\d]{2}))+)(?:\+(?:(?:
[a-zA-Z\d$\-_.+!*'(),]|(?:%[a-fA-F\d]{2}))+))*(?:\?(?:(?:[a-zA-Z\d$\-_
.+!*'(),]|(?:%[a-fA-F\d]{2}))+))?)?(?:;esn=(?:(?:[a-zA-Z\d$\-_.+!*'(),
]|(?:%[a-fA-F\d]{2}))+))?(?:;rs=(?:(?:[a-zA-Z\d$\-_.+!*'(),]|(?:%[a-fA
-F\d]{2}))+)(?:\+(?:(?:[a-zA-Z\d$\-_.+!*'(),]|(?:%[a-fA-F\d]{2}))+))*)
?))|(?:cid:(?:(?:(?:[a-zA-Z\d$\-_.+!*'(),]|(?:%[a-fA-F\d]{2}))|[;?:@&=
])*))|(?:mid:(?:(?:(?:[a-zA-Z\d$\-_.+!*'(),]|(?:%[a-fA-F\d]{2}))|[;?:@
&=])*)(?:/(?:(?:(?:[a-zA-Z\d$\-_.+!*'(),]|(?:%[a-fA-F\d]{2}))|[;?:@&=]
)*))?)|(?:vemmi://(?:(?:(?:(?:(?:[a-zA-Z\d](?:(?:[a-zA-Z\d]|-)*[a-zA-Z
\d])?)\.)*(?:[a-zA-Z](?:(?:[a-zA-Z\d]|-)*[a-zA-Z\d])?))|(?:(?:\d+)(?:\
.(?:\d+)){3}))(?::(?:\d+))?)(?:/(?:(?:(?:[a-zA-Z\d$\-_.+!*'(),]|(?:%[a
-fA-F\d]{2}))|[/?:@&=])*)(?:(?:;(?:(?:(?:[a-zA-Z\d$\-_.+!*'(),]|(?:%[a
-fA-F\d]{2}))|[/?:@&])*)=(?:(?:(?:[a-zA-Z\d$\-_.+!*'(),]|(?:%[a-fA-F\d
]{2}))|[/?:@&])*))*))?)|(?:imap://(?:(?:(?:(?:(?:(?:(?:[a-zA-Z\d$\-_.+
!*'(),]|(?:%[a-fA-F\d]{2}))|[&=~])+)(?:(?:;[Aa][Uu][Tt][Hh]=(?:\*|(?:(
?:(?:[a-zA-Z\d$\-_.+!*'(),]|(?:%[a-fA-F\d]{2}))|[&=~])+))))?)|(?:(?:;[
Aa][Uu][Tt][Hh]=(?:\*|(?:(?:(?:[a-zA-Z\d$\-_.+!*'(),]|(?:%[a-fA-F\d]{2
}))|[&=~])+)))(?:(?:(?:(?:[a-zA-Z\d$\-_.+!*'(),]|(?:%[a-fA-F\d]{2}))|[
&=~])+))?))@)?(?:(?:(?:(?:(?:[a-zA-Z\d](?:(?:[a-zA-Z\d]|-)*[a-zA-Z\d])
?)\.)*(?:[a-zA-Z](?:(?:[a-zA-Z\d]|-)*[a-zA-Z\d])?))|(?:(?:\d+)(?:\.(?:
\d+)){3}))(?::(?:\d+))?))/(?:(?:(?:(?:(?:(?:[a-zA-Z\d$\-_.+!*'(),]|(?:
%[a-fA-F\d]{2}))|[&=~:@/])+)?;[Tt][Yy][Pp][Ee]=(?:[Ll](?:[Ii][Ss][Tt]|
[Ss][Uu][Bb])))|(?:(?:(?:(?:[a-zA-Z\d$\-_.+!*'(),]|(?:%[a-fA-F\d]{2}))
|[&=~:@/])+)(?:\?(?:(?:(?:[a-zA-Z\d$\-_.+!*'(),]|(?:%[a-fA-F\d]{2}))|[
&=~:@/])+))?(?:(?:;[Uu][Ii][Dd][Vv][Aa][Ll][Ii][Dd][Ii][Tt][Yy]=(?:[1-
9]\d*)))?)|(?:(?:(?:(?:[a-zA-Z\d$\-_.+!*'(),]|(?:%[a-fA-F\d]{2}))|[&=~
:@/])+)(?:(?:;[Uu][Ii][Dd][Vv][Aa][Ll][Ii][Dd][Ii][Tt][Yy]=(?:[1-9]\d*
)))?(?:/;[Uu][Ii][Dd]=(?:[1-9]\d*))(?:(?:/;[Ss][Ee][Cc][Tt][Ii][Oo][Nn
]=(?:(?:(?:[a-zA-Z\d$\-_.+!*'(),]|(?:%[a-fA-F\d]{2}))|[&=~:@/])+)))?))
)?)|(?:nfs:(?:(?://(?:(?:(?:(?:(?:[a-zA-Z\d](?:(?:[a-zA-Z\d]|-)*[a-zA-
Z\d])?)\.)*(?:[a-zA-Z](?:(?:[a-zA-Z\d]|-)*[a-zA-Z\d])?))|(?:(?:\d+)(?:
\.(?:\d+)){3}))(?::(?:\d+))?)(?:(?:/(?:(?:(?:(?:(?:[a-zA-Z\d\$\-_.!~*'
(),])|(?:%[a-fA-F\d]{2})|[:@&=+])*)(?:/(?:(?:(?:[a-zA-Z\d\$\-_.!~*'(),
])|(?:%[a-fA-F\d]{2})|[:@&=+])*))*)?)))?)|(?:/(?:(?:(?:(?:(?:[a-zA-Z\d
\$\-_.!~*'(),])|(?:%[a-fA-F\d]{2})|[:@&=+])*)(?:/(?:(?:(?:[a-zA-Z\d\$\
-_.!~*'(),])|(?:%[a-fA-F\d]{2})|[:@&=+])*))*)?))|(?:(?:(?:(?:(?:[a-zA-
Z\d\$\-_.!~*'(),])|(?:%[a-fA-F\d]{2})|[:@&=+])*)(?:/(?:(?:(?:[a-zA-Z\d
\$\-_.!~*'(),])|(?:%[a-fA-F\d]{2})|[:@&=+])*))*)?)))

О_О убейте меня сразу… а если ошибся где-то в ней, или поправить чего-нибудь надо ( ._.)
Жаль плюсомета пока нету.
Есть дебаггеры для регулярок (например, RegexBuddy). Так, что если вы не состоите в секте «Любителей Блокнота» (вместо Блокнота может быть любой простой текстовый редактор), то особых проблем не будет.
param1, param2

Не называйте переменные больше так. Старайтесь давать им осмысленные названия.

Кроме того, в функции update, в моменте сбора query — зачем нужен цикл конкатенации, если можно воспользоваться Array.prototype.join?
Вполне осмысленное название… parameter1, parameter2 , я же не знаю что точно придет в parameter1.
— его может не прийти вовсе.
— а может прийти строка, тогда имело бы смысл назвать эту переменную value ( ибо если param1 указан, то это сеттер )
— а для метода params это был бы key ( читаем параметр с указанным ключом )
— а если пришла строка в param2, тогда param1 стоило бы назвать key, а param2value
— а если в param1 пришел хэш, то тогда param1 надо назвать hash
Как посоветуете быть в этом случае?

Что же касается Array.prototype.join то array.join склеивает весь массив с 1 сепаратором.
А у меня:
1) Не массив, а хэш, Т.е. объект, а не массив.( хотя вот если память не изменяет join и у хешей есть )
2) Мне надо склеивать значения с разными сепараторами.
Меня прям умиляют эти минусёры…
Вот за что минус этому комменту?
Мне всегда было интересно, а как решать задаче роутинга с помощью js. И что если сайт динамический и количество роутингов добавляется? Предлагаете конструировать js файл на сервере ?(хотя он может стать просто адских размеров)
А что именно за задача и в чём проблема сделать роутинг на js? Если сайт динамический, то делать какой-то фиксированный предгенерённый js-файл для роутинга бессмысленно же. Пусть оно динамически и обрабатывается. Я вот на прошлом месте работы сделал веб-приложение, которое, фактически, состоит из одной html-странички, а все внутренние переходы – на js. В общем виде никакой проблемы нет, насколько я понимаю.
У меня сейчас есть такое же приложение, роутинг делается правда в angular точнее в ui-router.
Однако, что будет если количество страниц перевалит за 1000 ?)
Нужно делать какой-то «умный» роутинг, который подгружал бы нужные js постепенно по мере разбирания url
С angular работал мало, так что спорить не буду. У меня была такая схема (грубо говоря) – 1 шаблон = 1 страница, адрес страницы совпадает с именем шаблона. Соответственно, абсолютно неважно, сколько страниц, 5 или 5000 – роутинг от этого ни разу не усложняется и не увеличивается.
Это если он совпадает, то да. А что делать если нет совпадения.
Там сделано, через routeProvider. Вот вопрос о том, что будет если в нем появится около милиона ссылок? Строк кода будет еще больше, потому что нужно прописать ссылку на темлеит и контроллер.
Просто привел пост о котором знаю=)
как там сделано уже не помню.

а о быстрых решениях написал и я и норлин, сообщения норлина не видел, у него там развернутее
Ну если у вас в приложении сотни и тысячи уникальных страниц – это выглядит, мягко говоря, странно.
Можно к каждой странице прикладывать мини-конфиг, состоящий из пары «адрес»: «имя шаблона», далее при «компиляции» приложения все эти конфиги склеивать в одну табличку роутинга и использовать её.
По возможности – организовать иерархическую структуру страниц, чтоб не надо было сразу подгружать вообще всё.

Ещё раз – я смотрю на проблему с точки зрения «вообще», а не конкретно Angular.
как вариант передавать в урле либо ?template=xxx, либо #template_name
если оны не заняты под другие нужды
Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.