我想为我的HTML输出制作自定义替换方法。但我无法弄明白。我想应该以某种方式使用String.match
和replace
完成。
我的字符串中有一些“错误代码”总是以_err_开头,我有一个带有值的JS对象。
我想要实现的目标:
某些错误代码可能会多次出现。
var content = "Looks like you have _err_no_email or _err_no_code provided";
var Lang = {
'no_email' : "No email",
'no_code' : "No code"
};
我可以通过其他方式做到这一点。所以我循环Lang
对象并替换字符串中的对象。
如果使用下划线,它会是这样的:
function replaceMe() {
_.each(Lang, function(value, key) {
content = content.replace(new RegExp('_err_' + key,'g'), value);
});
console.log(content);
};
但如果我的第一个想法可以更快地完成,那么我想知道如何。
答案 0 :(得分:4)
一个简单的正则表达式可以解决这个问题:
var content = content.replace(/\b_err_(.+?)\b/g, function(match, errorName) {
return Lang[errorName] || match;
});
这假设您不希望替换"blah_err_blah"
之类的字符串,并且如果在Lang
对象中找不到错误,则默认不替换文本。
答案 1 :(得分:1)
var replace = function(str, object, regexp) { //if property not found string is not replaced
return String(str).replace(regexp || (/\\?\{([^{}]+)\}/g), function(match, name) {
return (object[name] != null) ? object[name] : match;
});
}
这是我在几个项目中使用的格式函数非常有效。默认情况下将{prop}
与{prop:'val'}匹配,但您可以传递正则表达式,例如可能在您的情况/_err_+\S/g
中,因此它与您字符串中的其他标记相匹配。
所以你可以这样做:
var content ="Looks like you have {no_email} or {no_code} provided";
var Lang = {
'no_email' : "No email",
'no_code' : "No code"
}
var formatted = replace(content, lang);
或者你的原始字符串窃取其他答案正则表达式:
var formatted = replace(content, lang, /_err_([^\s]+)/g)
答案 2 :(得分:1)
您可以使用回调函数,查看您的Lang
对象中是否存在与错误代码匹配的密钥,如果是,则返回该值的值(否则只是密钥本身,因此不进行替换,像这样:
content.replace(/_err_([a-z_]+)/gi, function(fullmatch, key) {
return Lang[key] ? Lang[key] : fullmatch;
});
传递给函数的第一个参数是完全匹配,第二个参数key
只是按括号分组的部分。
然后,如果Lang
包含key
的(非虚假)值,则会返回该值,否则只返回fullmatch
值,以便该字符串的那一部分被自己“替换”了。
在此处查看此行动:http://jsfiddle.net/VZVLt/1/
答案 3 :(得分:0)
split
content = content
.split('_err_')
.map(function(str, index){
if (index === 0)
return str;
var whitespace = str.indexOf(' '),
key = str.substring(0, whitespace)
return Lang[key] + str.substring(whitespace);
})
.join('')
;