我在博客的评论中有来自此来源的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('')
}
答案 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;