Varsayımlar
Soruya dayanarak, bu işlev için bazı varsayımların / gereksinimlerin şunları içerdiğine inanıyorum:
- Bir kütüphane işlevi olarak kullanılacaktır ve bu nedenle herhangi bir kod tabanına bırakılması amaçlanmıştır;
- Bu nedenle, birçok farklı ortamda çalışması, örneğin eski JS kodu, çeşitli kalite seviyelerinde CMS'ler vb. İle çalışması gerekir ;
- Diğer kişiler tarafından yazılan kodlarla ve / veya denetlemediğiniz kodlarla etkileşime girmek için işlev , çerez adlarının veya değerlerinin nasıl kodlandığı konusunda herhangi bir varsayımda bulunmamalıdır . İşlevi bir dize ile çağırmak,
"foo:bar[0]"
"foo: bar [0]" adlı bir çerez (tam anlamıyla) döndürmelidir;
- Yeni çerezler yazılabilir ve / veya mevcut çerezler sayfanın ömrü boyunca herhangi bir zamanda değiştirilebilir .
Bu varsayımlar altında, kullanılmasınınencodeURIComponent
/ decodeURIComponent
kullanılmaması gerektiği açıktır ; bunu yapmak, çerezi ayarlayan kodun bu işlevleri kullanarak kodladığını varsayar.
Çerez adı özel karakterler içeriyorsa normal ifade yaklaşımı sorunlu hale gelir. jQuery.cookie, bir çerez depolanırken çerez adını (aslında hem ad hem de değer) kodlayarak ve bir çerez alırken adın kodunu çözerek bu soruna geçici bir çözüm sağlar. Düzenli bir ifade çözümü aşağıdadır.
Yalnızca tamamen kontrol ettiğiniz çerezleri okumadığınız sürece, çerezleri document.cookie
doğrudan okumanız ve sonuçları önbelleğe almamanız da önerilir , çünkü önbelleğin document.cookie
tekrar okumadan geçersiz olup olmadığını bilmenin bir yolu yoktur .
(Erişim ve ayrıştırma document.cookies
önbellek kullanmaktan biraz daha yavaş olsa da, çerezler DOM / render ağaçlarında bir rol oynamadığından DOM'un diğer bölümlerini okumak kadar yavaş olmaz.)
Döngü tabanlı işlev
İşte PPK'nın (döngü tabanlı) işlevine dayanan Code Golf yanıtı:
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, '');
}
bu simge küçültüldüğünde 128 karaktere gelir (işlev adını saymaz):
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,'');}
Normal ifade tabanlı işlev
Güncelleme: Gerçekten düzenli bir ifade çözümü istiyorsanız:
function readCookie(name) {
return (name = new RegExp('(?:^|;\\s*)' + ('' + name).replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&') + '=([^;]*)').exec(document.cookie)) && name[1];
}
Bu , RegExp nesnesini oluşturmadan önce çerez adındaki özel karakterlerden kaçar . Küçültülmüşse, bu 134 karaktere gelir (işlev adını saymaz):
function readCookie(n){return(n=new RegExp('(?:^|;\\s*)'+(''+n).replace(/[-[\]{}()*+?.,\\^$|#\s]/g,'\\$&')+'=([^;]*)').exec(document.cookie))&&n[1];}
Yorumlarda Rudu ve cwolves'in işaret ettiği gibi, düzenli ifadeden kaçan normal ifade birkaç karakterle kısaltılabilir. Ben kaçan regex tutarlı tutmak için iyi olacağını düşünüyorum (başka bir yerde kullanıyor olabilirsiniz), ama onların önerileri dikkate değer.
notlar
Bu işlevlerin her ikisi de işlemez null
veya undefined
başka bir deyişle "null" adında bir çerez varsa readCookie(null)
değerini döndürür. Bu durumu ele almanız gerekiyorsa, kodu uygun şekilde uyarlayın.