1

我想为我的 HTML 输出制作自定义替换方法。但我无法弄清楚。我想它应该以String.match某种replace方式完成。

我的字符串中有一些“错误代码”总是以 _err_ 开头,并且我有一个带有值的 JS 对象。

我想要达到的目标:

  1. 查找以 _err_ 开头的所有字符串部分(错误代码)
  2. 为我的对象获取正确的密钥 - 没有 _err_ 的错误代码
  3. 从 Lang 对象中查找值
  4. 用正确的 Lang 值替换错误代码。

某些错误代码可能会出现多次。

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

但是,如果我的第一个想法可以更快地完成,那么我想知道如何。

4

4 回答 4

4

一个简单的正则表达式应该可以解决问题:

var content = content.replace(/\b_err_(.+?)\b/g, function(match, errorName) {
    return Lang[errorName] || match;
});

这假定您不希望替换字符串 like ,并且如果在您的对象"blah_err_blah"中找不到错误,则默认不替换文本。Lang

于 2013-11-10T23:30:08.940 回答
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)
于 2013-11-10T23:29:55.110 回答
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/

于 2013-11-10T23:34:37.217 回答
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('')
        ;
于 2013-11-10T23:40:28.793 回答