具有split(),indexOf()和RegExp的字符串处理机会

本文探讨了在不同浏览器中一致地读取和解析Cookie值的挑战,特别是针对IE和其他浏览器在Cookie处理上的差异。通过对比split和正则表达式方法,文章提供了一种可靠的跨浏览器解决方案。

以下小的HowTo是对通过不同的字符串处理方法获取某些cookie值的原始问题的汇编。

原始问题发布如下:

你好

以为我会和你分享我遇到的一个小问题。
查看此代码。


var ca = document.cookie.split(';');    
var value = ""; 
for (var x = 0; x < ca.length; x++) {
    if (ca[x].indexOf(name) == 0) {
        var start  = ca[x].indexOf('=') + 1;
        var length = ca[x].length - start; 
        value = ca[x].substr(start, length);
    }
} 
这段代码基本上采用了整个document.cookie字符串,并在每个';'处进行分割。 然后在每个名称的开头搜索“名称”。

这在IE中工作正常,但在我检查过的所有其他浏览器(Firefox,Opera,Netscape)中均失败。

事实证明,除了MS决定的所有人以外,在split命令的每个部分之前都留一个空格(ascii nr 32),这使indexOf返回1而不是0。

现在我要问.. WTF?!?

无论如何,请谨慎使用split命令。

-AtliÞór
如您所见,拆分方法可能存在问题。 下面的简短文章介绍了解决这个可能无法解决的问题的方法,但是我们有时可能会遇到。 如果没有其他问题,那么所显示的改编将有助于理解如何检索cookie值或使用不同的js方法处理字符串值。 首先,我们测试拆分方法,因为Atli猜测它可能存在问题:

split命令在FF 2.0.0.9中效果很好:

我使用了以下代码:


var val = 'a=1;b=2;c=3' 
var arr = val.match(/[^;]+/g); 
// arr is ["a=1", "b=2", "c=3"] now 
arr = val.split(';'); 
// arr is ["a=1", "b=2", "c=3"] now 
因此它可以按预期工作,我只是使用regEx来显示另一种从字符串“ val”创建数组的方法。 两种方法是等效的。 接下来,我检查了indexOf代码……也按预期工作:

// lets assume we want to alert the value of c
var name = 'c'; 
for(var x = 0; x < arr.length; x++) {
   if (arr[x].indexOf(name) == 0) {
      var start = arr[x].indexOf('=') + 1;
      var length = arr[x].length - start; 
      var value = arr[x].substr(start, length);
      alert(value);
   }
} 
但是我们也可以在这里使用regEx:

for (var x = 0; x < arr.length; x++) {
   if ((new RegExp('^' + name)).test(arr[x])) {
      var value = arr[x].match(/[^=]+$/);
      alert(value);
   }
}
所以我找不到indexOf或split的任何问题...但是在有问题的情况下,我们有选择权来解决它们的问题:)

因此,现在我们发现问题可能是分裂方法之外的另一个问题。 Atli回应:

regEx技巧肯定会派上用场。

现在回头看,我发现我仅使用Cookie中的数据测试了此问题。 了解M $遵循标准的程度,以及它们与众不同的程度后,我认为问题很可能出在Cookie数据而非split命令上。

IE很有可能在一个空白字符串中创建cookie,而其他浏览器在值之间添加一个空格,因此当我在每个分号上分割它时,会导致有多余的空间。
因此,我们可以再次使用regExp来处理该问题,以防出现真正的问题:

var value = ' c=1';
value = value.replace(/^\s+/, ''); 
// now value has 'c=1' assigned 
只会在字符串值的开头删除所有空格。

现在,编解码器介入并提供了从w3schools派生的getCookie函数,使我们回到了最初的问题:

function getCookie(name) {
  if (document.cookie.length > 0) {
    start = document.cookie.indexOf (name + "=");
    if (start != -1) {
      start += name.length + 1;
      end = document.cookie.indexOf(";",start);
      if (end == -1) end = document.cookie.length;
      return unescape(document.cookie.substring(start,end));
    }
  }
  return "";
}
[改编自W3Schools JavaScript Cookies ]

因此,此HowTo是一个有关如何遇到问题以及如何解决和/或回到基本问题的小案例研究... :),它再次表明,与之一起处理代码,效率更高一个人,因为我们可以从一开始就了解到问题可能并不十分清楚,所以我们总是可以找到一种绕过一种特殊代码用法的方法,并且关注原始问题始终是一个优势:)

From: https://bytes.com/topic/javascript/insights/582125-string-handling-opportunities-split-indexof-regexp

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值