parseUri 1.2:Rozdělení URL v JavaScriptu

Právě jsem aktualizoval parseUri. Pokud jste neviděli starší verzi, parseUri je funkce, která rozděluje jakýkoli dobře vytvořený URI na jeho části, z nichž všechny jsou volitelné. Jeho kombinace přesnosti, flexibility a stručnosti je bezkonkurenční.

Důležité:

  • Komplexně rozděluje identifikátory URI, včetně rozdělení řetězce dotazu na páry klíč/hodnota. (Vylepšené)
  • Dva režimy analýzy:volná a přísná. (Nové)
  • Snadné použití (vrací objekt, takže můžete dělat, např. parseUri(uri).anchor ).
  • Nabízí pohodlné, předem zřetězené komponenty (cesta =adresář a soubor; autorita =userInfo, hostitel a port atd.)
  • Změňte výchozí názvy částí URI bez úpravy funkce aktualizací parseUri.options.key . (Nové)
  • Výjimečně lehký (1 kB před minifikace nebo gzipování).
  • Vydáno pod licencí MIT.

Podrobnosti:

Starší verze této funkce používaly to, co se nyní nazývá režim volné analýzy (což je v této verzi stále výchozí). Volný režim se mírně odchyluje od oficiální obecné specifikace URI (RFC 3986), ale tím umožňuje funkci rozdělit URI způsobem, který by většina koncových uživatelů intuitivně očekávala. Jemnější detaily volného režimu mu však brání ve správném zpracování relativních cest, které nezačínají od kořenového adresáře (např. „../file.html“ nebo „dir/file.html“). Na druhou stranu, přísný režim se pokouší rozdělit URI podle RFC 3986. Konkrétně ve volném režimu nemusí adresáře končit lomítkem (např. „dir“ v „/dir?query“ je považováno za adresář spíše než název souboru) a URI může začínat oprávněním, aniž by mu předcházelo „//“ (což znamená, že „yahoo.com“ v „yahoo.com/search/“ je považováno za hostitele, spíše než část cesty k adresáři).

Protože jsem předpokládal, že většina vývojářů bude chtít trvale používat jeden nebo druhý režim, režim analýzy není uveden jako argument při spuštění parseUri , ale spíše jako vlastnost parseUri samotná funkce. Jednoduše spusťte následující řádek kódu a přepněte do přísného režimu:

parseUri.options.strictMode = true;

Od tohoto okamžiku bude parseUri fungovat v přísném režimu (dokud jej znovu nevypnete).

Kód:

// parseUri 1.2.2
// (c) Steven Levithan <stevenlevithan.com>
// MIT License

function parseUri (str) {
	var	o   = parseUri.options,
		m   = o.parser[o.strictMode ? "strict" : "loose"].exec(str),
		uri = {},
		i   = 14;

	while (i--) uri[o.key[i]] = m[i] || "";

	uri[o.q.name] = {};
	uri[o.key[12]].replace(o.q.parser, function ($0, $1, $2) {
		if ($1) uri[o.q.name][$1] = $2;
	});

	return uri;
};

parseUri.options = {
	strictMode: false,
	key: ["source","protocol","authority","userInfo","user","password","host","port","relative","path","directory","file","query","anchor"],
	q:   {
		name:   "queryKey",
		parser: /(?:^|&)([^&=]*)=?([^&]*)/g
	},
	parser: {
		strict: /^(?:([^:\/?#]+):)?(?:\/\/((?:(([^:@]*)(?::([^:@]*))?)?@)?([^:\/?#]*)(?::(\d*))?))?((((?:[^?#\/]*\/)*)([^?#]*))(?:\?([^#]*))?(?:#(.*))?)/,
		loose:  /^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/)?((?:(([^:@]*)(?::([^:@]*))?)?@)?([^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/
	}
};

Můžete si jej stáhnout zde.

parseUri nemá žádné závislosti a byl testován v IE 5.5–7, Firefox 2.0.0.4, Opera 9.21, Safari 3.0.1 beta pro Windows a Swift 0.2.