JS String.replace可以在Safari中发挥作用

时间:2010-10-07 00:13:21

标签: javascript replace

背景故事:

这适用于所有浏览器,除了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 个答案:

答案 0 :(得分:2)

我无法重现这个问题,因为我不确定chunk的价值是什么。

无论如何,这是不必要使用eval的另一个例子,您可以使用RegExp构造函数从字符串构建RegExp对象,例如:

var re = /foo/gi;

等同于使用RegExp构造函数在运行时创建对象:

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);

答案 1 :(得分:0)

所以 - 我在问题区域(自然地)试了一下try / catch来尝试获得关于错误的某种反馈。有趣的是,我没有错误,问题就消失了。怪异。

解决方案:

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) {}