代码之家  ›  专栏  ›  技术社区  ›  Jacksonkr

JS公司字符串.替换可以是临时的旅行

  •  1
  • Jacksonkr  · 技术社区  · 16 年前

    背景故事:

    除了Safari(5.0.1),这在所有浏览器中都可以正常工作

    var chunk = arr[i];
    chunk = chunk.replace('$', '\\$');
    var a = eval('message.match(/' + chunk + '/gi);');
    if(a instanceof Array) symbol = symbol.concat(a);
    

    所以我修改如下:

    var chunk = String(arr[i]);
    chunk = chunk.replace('$', '\\$');
    var a = eval('message.match(/' + chunk + '/gi);');
    if(a instanceof Array) symbol = symbol.concat(a);
    

    这让Safari更高兴的是它只是抛出了一个模棱两可的错误(有趣!)

    我已经找到了解决方案,我会把它贴在下面,以防其他编剧遇到这个问题。

    2 回复  |  直到 10 年前
        1
  •  2
  •   Christian C. Salvadó    16 年前

    我无法重现这个问题,因为我不确定 chunk

    无论如何,这是不必要使用 eval ,您可以使用 RegExp 构造函数来构建 正则表达式 对象,例如:

    var re = /foo/gi;
    

    正则表达式

    var re = new RegExp('foo', 'gi');
    

    将其应用于代码:

    var chunk = String(arr[i]); // use String() only if you are not sure if arr[i] is
    
    // Be aware that the following line is replacing only the first $ 
    // char and you may want to scape other meta-characters:
    chunk = chunk.replace('$', '\\$');
    var a = message.match(new RegExp(chunk,'gi'));
    
    if(a instanceof Array) symbol = symbol.concat(a);
    
        2
  •  0
  •   Jacksonkr    12 年前

    所以-我试着(自然地)绕过问题区域,试图获得关于错误的某种反馈。有趣的是,我没有错误,问题就解决了。奇怪的。

    try {
      var chunk = String(arr[i]);
      chunk = chunk.replace('$', '\\$');
      var a = eval('message.match(/' + chunk + '/gi);');
      if(a instanceof Array) symbol = symbol.concat(a);
    } catch(e) {}