如何使用来自object的值替换javascript中的特定部分

时间:2013-11-10 23:20:32

标签: javascript regex replace

我想为我的HTML输出制作自定义替换方法。但我无法弄明白。我想应该以某种方式使用String.matchreplace完成。

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

我想要实现的目标:

  1. 查找以_err _
  2. 开头的所有字符串部分(错误代码)
  3. 获取我的对象的正确密钥 - 没有_err _
  4. 的错误代码
  5. 从Lang对象中查找值
  6. 使用正确的Lang值替换错误代码。
  7. 某些错误代码可能会多次出现。

    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 个答案:

答案 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('')
        ;