parseUri 1.2:URL divididas en JavaScript

Acabo de actualizar parseUri. Si no ha visto la versión anterior, Parseuri es una función que divide cualquier URI bien formado en sus partes, todos los cuales son opcionales. Su combinación de precisión, flexibilidad y brevedad no tiene rival.

Destacados:

  • Dividir de forma integral los URI, incluida la división de la cadena de consulta en pares clave/valor. (Mejorado)
  • Dos modos de análisis:suelto y estricto. (Nuevo)
  • Fácil de usar (devuelve un objeto, por lo que puede hacer, por ejemplo, parseUri(uri).anchor ).
  • Ofrece componentes prácticos preconcatenados (ruta =directorio y archivo; autoridad =información de usuario, host y puerto, etc.)
  • Cambie los nombres predeterminados de las partes de URI sin editar la función, actualizando parseUri.options.key . (Nuevo)
  • Excepcionalmente ligero (1 KB antes minificación o gzip).
  • Publicado bajo la licencia MIT.

Detalles:

Las versiones anteriores de esta función usaban lo que ahora se llama modo de análisis flexible (que sigue siendo el predeterminado en esta versión). El modo suelto se desvía ligeramente de la especificación URI genérica oficial (RFC 3986), pero al hacerlo permite que la función divida los URI de una manera que la mayoría de los usuarios finales esperarían intuitivamente. Sin embargo, los detalles más finos del modo suelto le impiden manejar correctamente las rutas relativas que no comienzan desde la raíz (por ejemplo, "../archivo.html" o "dir/archivo.html"). Por otro lado, el modo estricto intenta dividir los URI de acuerdo con RFC 3986. Específicamente, en el modo suelto, los directorios no necesitan terminar con una barra inclinada (por ejemplo, el "dir" en "/dir?query" se trata como una directorio en lugar de un nombre de archivo), y el URI puede comenzar con una autoridad sin estar precedido por "//" (lo que significa que "yahoo.com" en "yahoo.com/search/" se trata como el host, en lugar de que parte de la ruta del directorio).

Dado que asumí que la mayoría de los desarrolladores querrán usar un modo u otro constantemente, el modo de análisis no se especifica como argumento cuando se ejecuta parseUri , sino como una propiedad del parseUri función en sí. Simplemente ejecute la siguiente línea de código para cambiar al modo estricto:

parseUri.options.strictMode = true;

A partir de ese momento, parseUri funcionará en modo estricto (hasta que lo vuelvas a desactivar).

El código:

// 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*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/
	}
};

Puedes descargarlo aquí.

parseUri no tiene dependencias y ha sido probado en IE 5.5–7, Firefox 2.0.0.4, Opera 9.21, Safari 3.0.1 beta para Windows y Swift 0.2.