Obtener cookie por nombre
Tengo un captador para obtener el valor de una cookie.
Ahora tengo 2 cookies por el nombre shares=
y por el nombre obligations=
.
Quiero hacer este captador solo para obtener los valores de la cookie de obligaciones.
¿Cómo hago esto? Entonces for
divide los datos en valores separados y los coloca en una matriz.
function getCookie1() {
// What do I have to add here to look only in the "obligations=" cookie?
// Because now it searches all the cookies.
var elements = document.cookie.split('=');
var obligations= elements[1].split('%');
for (var i = 0; i < obligations.length - 1; i++) {
var tmp = obligations[i].split('$');
addProduct1(tmp[0], tmp[1], tmp[2], tmp[3]);
}
}
Un enfoque que evita la iteración sobre una matriz sería:
function getCookie(name) {
const value = `; ${document.cookie}`;
const parts = value.split(`; ${name}=`);
if (parts.length === 2) return parts.pop().split(';').shift();
}
Tutorial
Dividir una cadena por token producirá una matriz con una cadena (mismo valor), en caso de que el token no exista en una cadena, o una matriz con dos cadenas, en caso de que el token se encuentre en una cadena.
El primer elemento (izquierda) es la cadena de lo que estaba antes del token, y el segundo (derecha) es la cadena de lo que estaba después del token.
(NOTA: en caso de que la cadena comience con un token, el primer elemento es una cadena vacía)
Teniendo en cuenta que las cookies se almacenan de la siguiente manera:
"{name}={value}; {name}={value}; ..."
Para recuperar un valor de cookie específico, solo necesitamos obtener la cadena que está después de "; {name}=" y antes del siguiente ";". Antes de realizar cualquier procesamiento, anteponemos "; " a la cadena de cookies, de modo que cada nombre de cookie, incluido el primero, esté entre "; " y "=":
"; {name}={value}; {name}={value}; ..."
Ahora, primero podemos dividir por "; {nombre}=", y si el token se encuentra en una cadena de cookies (es decir, tenemos dos elementos), terminaremos con el segundo elemento como una cadena que comienza con nuestro valor de cookie. Luego lo sacamos de una matriz (es decir, pop) y repetimos el mismo proceso, pero ahora con ";" como token, pero esta vez sacando la cadena izquierda (es decir, desplazar) para obtener el valor real del token.
Preferiría usar una única expresión regular en la cookie:
window.getCookie = function(name) {
var match = document.cookie.match(new RegExp('(^| )' + name + '=([^;]+)'));
if (match) return match[2];
}
O también podemos usarlo como función, verifique el código a continuación.
function getCookieValue(name)
{
const regex = new RegExp(`(^| )${name}=([^;]+)`)
const match = document.cookie.match(regex)
if (match) {
return match[2]
}
}
Mejorado gracias a Scott Jungwirth en los comentarios.