অনুমিতি
প্রশ্নের ভিত্তিতে, আমি বিশ্বাস করি যে এই ফাংশনটির জন্য কিছু অনুমান / প্রয়োজনীয়তার মধ্যে রয়েছে:
- এটি একটি লাইব্রেরির ফাংশন হিসাবে ব্যবহৃত হবে , এবং তাই কোনও কোডবেসে ফেলে দেওয়া হবে;
- সেই হিসাবে এটির জন্য বিভিন্ন বিভিন্ন পরিবেশে কাজ করা দরকার , যেমন লিগ্যাসি জেএস কোড, বিভিন্ন স্তরের মানের সিএমএস ইত্যাদির সাথে কাজ করা;
- অন্যান্য ব্যক্তিদের দ্বারা লিখিত কোড এবং / অথবা আপনার নিয়ন্ত্রণ নেই এমন কোডের সাথে আন্তঃচালনা করতে, ফাংশনটিতে কুকির নাম বা মানগুলি কীভাবে এনকোড করা হয় সে সম্পর্কে কোনও অনুমান করা উচিত নয় । স্ট্রিং সহ ফাংশনটি কল করার সাথে
"foo:bar[0]"
"foo: বার [0]" নামের একটি কুকি (আক্ষরিক) ফিরিয়ে দেওয়া উচিত;
- পৃষ্ঠার জীবদ্দশায় যে কোনও সময়ে নতুন কুকিগুলি লিখিত হতে পারে এবং / অথবা বিদ্যমান কুকিজগুলি সংশোধিত হতে পারে ।
এই অনুমানের অধীনে, এটি পরিষ্কার যে encodeURIComponent
/ decodeURIComponent
ব্যবহার করা উচিত নয় ; এটি করার ফলে ধরে নেওয়া হয় যে কুকি সেট করা কোডটি এই ফাংশনগুলি ব্যবহার করে এটি এনকোড করেছে।
যদি কুকির নামটিতে বিশেষ অক্ষর থাকতে পারে তবে নিয়মিত এক্সপ্রেশন পদ্ধতির সমস্যা হয়। jQuery.cookie কুকি সংরক্ষণ করার সময় কুকির নাম (আসলে নাম এবং মান উভয়) এনকোড করে এবং একটি কুকি পুনরুদ্ধার করার পরে নামটি ডিকোড করে এই সমস্যাটির চারপাশে কাজ করে। একটি নিয়মিত প্রকাশের সমাধান নীচে।
আপনি যদি কেবল কুকিগুলি সম্পূর্ণরূপে নিয়ন্ত্রণ করেন তবে আপনি সরাসরি কুকিগুলি পড়তেdocument.cookie
এবং ফলাফলগুলি ক্যাশে না করার পরামর্শ দেওয়া হবে , কারণ ক্যাশেটি document.cookie
আবার না পড়লে অবৈধ কিনা তা জানার উপায় নেই ।
(অ্যাক্সেস এবং পার্সিং যখন document.cookies
ক্যাশে ব্যবহারের চেয়ে কিছুটা ধীর হবে তবে এটি ডিওএমের অন্যান্য অংশগুলি পড়ার মতো ধীর হবে না, যেহেতু কুকিজ DOM / রেন্ডার গাছগুলিতে ভূমিকা রাখে না))
লুপ-ভিত্তিক ফাংশন
পিপিকে (লুপ-ভিত্তিক) ফাংশনের উপর ভিত্তি করে কোড গল্ফ উত্তরটি এখানে দেয়:
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, '');
}
যা ছোট করা হলে, 128 টি অক্ষরে আসে (ফাংশনটির নাম গণনা করা হয় না):
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,'');}
নিয়মিত প্রকাশ-ভিত্তিক ফাংশন
আপডেট: আপনি যদি সত্যিই নিয়মিত প্রকাশের সমাধান চান:
function readCookie(name) {
return (name = new RegExp('(?:^|;\\s*)' + ('' + name).replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&') + '=([^;]*)').exec(document.cookie)) && name[1];
}
এই পালাতে RegExp অবজেক্ট নির্মাণের আগে কুকি নামে কোনো বিশেষ অক্ষর। Minified, এটি 134 টি অক্ষরে আসে (ফাংশনটির নাম গণনা করছে না):
function readCookie(n){return(n=new RegExp('(?:^|;\\s*)'+(''+n).replace(/[-[\]{}()*+?.,\\^$|#\s]/g,'\\$&')+'=([^;]*)').exec(document.cookie))&&n[1];}
রুদু এবং কোলভস যেমন মন্তব্যগুলিতে উল্লেখ করেছেন, নিয়মিত-এক্সপ্রেশন-অব্যাহতি রেজেক্স কয়েকটি চরিত্র দ্বারা সংক্ষিপ্ত করা যেতে পারে। আমি মনে করি অব্যাহতিমান রেজেক্সকে ধারাবাহিকভাবে রাখা ভাল হবে (আপনি এটি অন্য কোথাও ব্যবহার করতে পারেন) তবে তাদের পরামর্শগুলি বিবেচনা করার মতো।
মন্তব্য
এই উভয় ফাংশন হ্যান্ডেল করবে না null
বা undefined
, যদি "নাল" নামে কোনও কুকি থাকে তবে readCookie(null)
এর মানটি ফিরিয়ে দেবে। আপনার যদি এই কেসটি পরিচালনা করতে হয় তবে সেই অনুযায়ী কোডটি মানিয়ে নিন।