parseUri:Rozdělení URL v JavaScriptu

Aktualizace: Následující příspěvek je zastaralý. Viz parseUri 1.2 pro nejnovější, nejlepší verzi.

Pro zábavu jsem strávil 10 minut potřebných k převedení mého parseUri() ColdFusion UDF na funkci JavaScript.

Pro ty, kteří to ještě neviděli, zopakuji své vysvětlení z druhého příspěvku…

parseUri() rozdělí jakýkoli správně vytvořený identifikátor URI na jeho části (všechny jsou volitelné ). Všimněte si, že všechny části jsou rozděleny pomocí jednoho regulárního výrazu pomocí zpětných referencí a všechna seskupení, která neobsahují kompletní části URI, nezachycují. Moje oblíbená část této funkce je její robustní podpora pro rozdělení cesty k adresáři a názvu souboru (podporuje adresáře s tečkami a bez koncového zpětného lomítka), které jsem v jiných analyzátorech URI neviděl. Protože funkce vrací objekt, můžete to udělat např. parseUri(uri).anchor , atd.

Měl bych poznamenat, že podle návrhu se tato funkce nepokouší ověřit URI, které obdrží, protože by to omezovalo její flexibilitu. IMO je validace zcela nesouvisející proces, který by měl nastat před nebo po rozdělení URI na jeho části.

Tato funkce nemá žádné závislosti a měla by fungovat napříč prohlížeči. Byl testován v IE 5.5–7, Firefox 2 a Opera 9.

/* parseUri JS v0.1.1, by Steven Levithan <http://stevenlevithan.com>
Splits any well-formed URI into the following parts (all are optional):
----------------------
- source (since the exec method returns the entire match as key 0, we might as well use it)
- protocol (i.e., scheme)
- authority (includes both the domain and port)
  - domain (i.e., host; can be an IP address)
  - port
- path (includes both the directory path and filename)
  - directoryPath (supports directories with periods, and without a trailing backslash)
  - fileName
- query (does not include the leading question mark)
- anchor (i.e., fragment) */
function parseUri(sourceUri){
	var uriPartNames = ["source","protocol","authority","domain","port","path","directoryPath","fileName","query","anchor"],
		uriParts = new RegExp("^(?:([^:/?#.]+):)?(?://)?(([^:/?#]*)(?::(\\d*))?)((/(?:[^?#](?![^?#/]*\\.[^?#/.]+(?:[\\?#]|$)))*/?)?([^?#/]*))?(?:\\?([^#]*))?(?:#(.*))?").exec(sourceUri),
		uri = {};
	
	for(var i = 0; i < 10; i++){
		uri[uriPartNames[i]] = (uriParts[i] ? uriParts[i] : "");
	}
	
	/* Always end directoryPath with a trailing backslash if a path was present in the source URI
	Note that a trailing backslash is NOT automatically inserted within or appended to the "path" key */
	if(uri.directoryPath.length > 0){
		uri.directoryPath = uri.directoryPath.replace(/\/?$/, "/");
	}
	
	return uri;
}

Otestujte to.

Existuje nějaký štíhlejší a horší analyzátor URI? 🙂

Upravit: Tato funkce aktuálně nepodporuje identifikátory URI, které obsahují pár uživatelské jméno nebo uživatelské jméno/heslo (např. „http://user:[email protected]/“). Nezajímalo mě to, když jsem původně psal ColdFusion UDF, na kterém je založen, protože takové URI nikdy nepoužívám. Nicméně od té doby, co jsem to vydal, mám pocit, že podpora by tam měla být. Podpora takových URI a vhodné rozdělení částí by bylo snadné. Co by trvalo déle, je vytvoření vhodného, ​​velkého seznamu všech druhů URI (dobře vytvořených i ne) k opětovnému testování funkce. Pokud však lidé zanechají komentáře s žádostí o podporu, budu pokračovat a přidám ji.