JavaScript string.format函数在IE中不起作用

时间:2010-01-28 09:20:07

标签: javascript internet-explorer

我在博客的评论中有来自此来源的JavaScript:frogsbrain

这是一个字符串格式化程序,它在Firefox,Google Chrome,Opera和Safari中运行良好。 唯一的问题是在IE中,脚本根本不替换。 IE中两个测试用例的输出只是“你好”,仅此而已。

请帮助我让这个脚本在IE中运行,因为我不是Javascript专家,我只是不知道从哪里开始搜索问题。

为方便起见,我会在这里发布脚本。到目前为止,所有积分都会转到Terence Honles

// usage:
// 'hello {0}'.format('world');
// ==> 'hello world'
// 'hello {name}, the answer is {answer}.'.format({answer:'42', name:'world'});
// ==> 'hello world, the answer is 42.'
String.prototype.format = function() {
    var pattern = /({?){([^}]+)}(}?)/g;
    var args = arguments;

    if (args.length == 1) {
        if (typeof args[0] == 'object' && args[0].constructor != String) {
            args = args[0];
        }
    }

    var split = this.split(pattern);
    var sub = new Array();

    var i = 0;
    for (;i < split.length; i+=4) {
        sub.push(split[i]);
        if (split.length > i+3) {
            if (split[i+1] == '{' && split[i+3] == '}')
                sub.push(split[i+1], split[i+2], split[i+3]);
            else {
                sub.push(split[i+1], args[split[i+2]], split[i+3]);
            }
        }
    }

    return sub.join('')
}

2 个答案:

答案 0 :(得分:3)

我认为问题在于此。

var pattern = /({?){([^}]+)}(}?)/g;
var split = this.split(pattern);

Javascript的正则表达式分割功能在IE中与其他浏览器不同。

请在SO

中查看我的其他post

答案 1 :(得分:1)

  

var split = this.split(pattern);

string.split(regexp)在IE(JScript)上以多种方式被破坏,通常最好避免使用。特别是:

  • 它不包括输出数组中的匹配组
  • 它省略了空字符串

    alert('abbc'.split(/(b)/))// a,c

使用replace而不是split

似乎更简单
String.prototype.format= function(replacements) {
    return this.replace(String.prototype.format.pattern, function(all, name) {
        return name in replacements? replacements[name] : all;
    });
}
String.prototype.format.pattern= /{?{([^{}]+)}}?/g;