两个符号之间的字符串替换?

3

I have an object like this :

myDataObject = {
    name : 'Nikola Tesla',
    birth : ['10 July 1856','10. Juli 1856'],
    nation : ['Serbian','Serbisch'],
    knownFor : ['Alternating current',' Zweiphasenwechselstrom']
}

还有两个类似于这样的字符串模式:

var englishStr = '#name#, born #birth[1]# , #nation[1]# best known for his contributions to #knownFor[1]#';

var deutschStr = '#name#, geboren #birth[2]#, #nation[2]# Erfinder, der für seine Beiträge zur #knownFor[2]# bekannt';

现在我想替换这样标记的 #properties#
如果没有类似于 [1] 或 [2] 等多语言指示符,我可以很容易地完成它。
$.each(myDataObject , function(n, v){
    englishStr = englishStr.replace('#'+ n +'#' , v )
});

那么关于 #prop[i]# 我该怎么办?谢谢。


1
这是一种奇怪的翻译方式。大多数情况下,您会为一种语言创建一个对象并使用它。 - epascarello
这只是一个简单的示例来说明我的情况。实际上,它更加复杂,我必须使用这种模式。有些属性可能没有像代码中的#name#那样的替代方案。 - user3253797
有很多现有的库可以做你想要的事情,例如moustache模板系统Mustache.render( '{{name}}, geboren am {{birth}}', { name: 'Nikola Tesla', birth: '10. Juli 1856' } )。不要重复造轮子。 - feeela
5个回答

3

一种方法是从字符串转换为数据对象,而不是循环遍历所有的键。

var myDataObject = {
    name : 'Nikola Tesla',
    birth : ['10 July 1856','10. Juli 1856'],
    nation : ['Serbian','Serbisch'],
    knownFor : ['Alternating current',' Zweiphasenwechselstrom']
};
var englishStr = "#name#, born #birth[1]# , #nation[1]# best known for his contributions to  #knownFor[1]#";




var re = /#([^\[#]+)\[?(\d+)?\]?#/;  //Looks for #STRING# or #STRING[NUMBER]#
var test;
while ( (test=re.exec(englishStr))!==null) {  //Keep looking for matches in the string
    var key = test[1];   //get the key to the object
    var index = test[2]; //get the index if there
    var item = myDataObject[key];  //get reference to the item in the object
    if (index!==undefined && item) {  //if we have an index, look up the value from array
        index = parseInt(index,10)-1;  //arrays are zero index, so need to subtract one
        item = item[index];  //get the string
    }
    englishStr = englishStr.replace(re, item || "N/A");  //make the replacement in the string with the data from the object
};

1
我建议您在这里尝试一种稍微不同的方法。不要盲目地循环遍历myDataObject来尝试替换值,而是首先提取需要替换的值,然后用它们的值进行替换。
var regex = /#(.*?)(?:\[(\d*)])?#/g;
while(match = regex.exec(englishStr)){
    var matchStr = match[0];
    var data = myDataObject[match[1]];
    if(match[2] !== undefined){
        data = data[match[2] - 1];
    }

    englishStr = englishStr.replace(matchStr, data);
}

演示:http://jsfiddle.net/35jZM/


1
看看这个是否有帮助。
$.each(myDataObject , function(n, v){

    if(typeof v == 'object'){
        $.each(v , function(index, value){
            englishStr = englishStr.replace('#'+ n +'[' + index + ']' + '#' , v[index-1]    );

        });
   }
englishStr = englishStr.replace('#'+ n +'#' , v )

});

演示


1
您可能想要使用 v[index-1] :-) - gen_Eric
@RocketHazmat 谢谢 :) - Mina Gabriel

1

可能有更好的解决方案,但我会这样做:

myDataObject = {
    name: 'Nikola Tesla',
    birth: ['10 July 1856', '10. Juli 1856'],
    nation: ['Serbian', 'Serbisch'],
    knownFor: ['Alternating current', ' Zweiphasenwechselstrom']
};

// English: 0, Deutsch: 1
var language = 0;

var str = "#name#, born #$birth# , #$nation# best known for his contributions to  #$knownFor#";

$.each(myDataObject, function (n, v) {
    str = str.replace('#' + n + '#', v);
    str = str.replace('#$' + n + '#', v[language]);
});

alert(str);

小提琴


1
你还可以在正则表达式替换中传递捕获组到回调函数中:
(请注意,如果你的翻译字符串中的数组从1开始索引,则需要将其添加到$2中)
englishStr.replace(/#(.+?)(?:\[(\d+)\])?#/g, function($0, $1, $2){ 
    return $2 === undefined ? myDataObject[$1] : myDataObject[$1][$2];
});

regex visualisation

演示


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接