Supuestos
Basado en la pregunta, creo que algunos supuestos / requisitos para esta función incluyen:
- Se utilizará como una función de biblioteca y, por lo tanto, se debe colocar en cualquier base de código;
- Como tal, tendrá que funcionar en muchos entornos diferentes , es decir, trabajar con código JS heredado, CMS de varios niveles de calidad, etc .;
- Para interactuar con el código escrito por otras personas y / o código que usted no controla, la función no debe hacer ninguna suposición sobre cómo se codifican los nombres o valores de cookies . Llamar a la función con una cadena
"foo:bar[0]"
debería devolver una cookie (literalmente) llamada "foo: bar [0]";
- Las cookies nuevas pueden escribirse y / o las cookies existentes pueden modificarse en cualquier momento durante la vida útil de la página.
Bajo estos supuestos, está claro que encodeURIComponent
/ decodeURIComponent
no debe usarse ; Al hacerlo, se supone que el código que establece la cookie también la codificó mediante estas funciones.
El enfoque de expresión regular se vuelve problemático si el nombre de la cookie puede contener caracteres especiales. jQuery.cookie soluciona este problema al codificar el nombre de la cookie (en realidad, tanto el nombre como el valor) al almacenar una cookie y decodificar el nombre al recuperar una cookie. Una solución de expresión regular está debajo.
A menos que solo esté leyendo las cookies que controla por completo, también sería recomendable leer las cookies document.cookie
directamente y no almacenar en caché los resultados, ya que no hay forma de saber si la memoria caché no es válida sin document.cookie
volver a leer .
(Si bien el acceso y el análisis document.cookies
serán un poco más lentos que el uso de un caché, no sería tan lento como leer otras partes del DOM, ya que las cookies no juegan un papel en los árboles DOM / render).
Función basada en bucle
Aquí va la respuesta de Code Golf, basada en la función PPK (basada en bucle):
function readCookie(name) {
name += '=';
for (var ca = document.cookie.split(/;\s*/), i = ca.length - 1; i >= 0; i--)
if (!ca[i].indexOf(name))
return ca[i].replace(name, '');
}
que cuando se minimiza, llega a 128 caracteres (sin contar el nombre de la función):
function readCookie(n){n+='=';for(var a=document.cookie.split(/;\s*/),i=a.length-1;i>=0;i--)if(!a[i].indexOf(n))return a[i].replace(n,'');}
Función basada en expresiones regulares
Actualización: si realmente quieres una solución de expresión regular:
function readCookie(name) {
return (name = new RegExp('(?:^|;\\s*)' + ('' + name).replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&') + '=([^;]*)').exec(document.cookie)) && name[1];
}
Esto escapa a cualquier carácter especial en el nombre de la cookie antes de construir el objeto RegExp. Minificado, esto llega a 134 caracteres (sin contar el nombre de la función):
function readCookie(n){return(n=new RegExp('(?:^|;\\s*)'+(''+n).replace(/[-[\]{}()*+?.,\\^$|#\s]/g,'\\$&')+'=([^;]*)').exec(document.cookie))&&n[1];}
Como Rudu y cwolves han señalado en los comentarios, la expresión regular de escape de expresión regular se puede acortar con algunos caracteres. Creo que sería bueno mantener la expresión regular de escape consistente (puede estar usándola en otro lugar), pero vale la pena considerar sus sugerencias.
Notas
Ambas funciones no manejarán null
o undefined
, es decir, si hay una cookie llamada "nulo", readCookie(null)
devolverá su valor. Si necesita manejar este caso, adapte el código en consecuencia.