使用正则表达式动态替换值

时间:2013-12-23 08:51:06

标签: javascript regex

我的表格中有一些数据

[
    {
        "name": "alex",
        "fullname": "Alessandro Magno"
    },
    {
        "name": "alex",
        "fullname": "Alessandro Magno"
    }
]

但是(name和fullname)不是固定的,它们可能是“key”/“value”,或者其他什么。 我也给了一个模板,例如:

var template = "<span>data.fullname (data.name)</span>".

我的问题如下:

  • 我必须寻找所有的“数据”。在字符串中,
  • 获取其后的值(在本例中为fullname和name),
  • 并替换数据。用我的外部来源。 E.g。

    str.replace("data.<value>", source[value]);
    

在Javascript中。

谢谢!

编辑:我可能错误地解释了它。我的源被定义(在这种情况下,是JSON格式的名称/全名列表)。我还有一个模板可供遵循。我必须用源的对应值替换模板中使用的语法(即“data。”['data。'已修复])。希望现在更清楚了!

重新谢谢!

3 个答案:

答案 0 :(得分:2)

使用字符串的简单replace调用只会替换子字符串的单个实例。你必须使用正则表达式 看看你想要做什么,我会说你可能正在寻找类似的东西:

var s = "<span>data.fullname (data.name)</span>";
var replacements = {name: 'alex', fullname: 'alessandro'};//example
s.replace(/(data\.)([a-z]+)/g, function(a,b,c)
{
    return b + (repl[c] || 'none');
});

这导致“data.alessandro(data.alex)”
这个怎么运作?这种方法的核心是正则表达式:

/(data\.)([a-z]+)/g,这是非常基本的:

  • (data\.):匹配并捕获文字字符串“data。”
  • ([a-z]+):再次:匹配&amp;捕获1个或多个字符以获取数据。 - &GT; “数据”。
  • g:是全局标志,将此模式应用于整个字符串。

现在,对于找到的这个模式的每个匹配,我提供了一个函数,它传递匹配的子字符串(以及捕获的组作为单独的参数),并使用函数构造替换,而不是提供替换字符串。字符串:

function(a, b, c)
{//a -> entire substring, b-> data., c-> string after data.
    return b + (replacements[c] || 'none');// logical || to provide default string replacement
}

就这么简单,真的。假设您的值包含在数组中的对象中,您可以选择编写以下代码:

var vals = [{name: 'alex', fullname: 'alessandro'},{name: 'alex2', fullname: 'alessandro2'}],
results =[],
template = "<span>data.fullname (data.name)</span>";
for (var i=0;i<vals.length;++i)
    results[i] = template.replace(/(data\.)([a-z]+)/g, function(a,b,c)
    {
        return b + (vals[i][c] || 'default');
    });

编辑:
要删除data.子字符串,请将回调函数(和模式)更改为:

s.replace(/data\.([a-z]+)/function(a,c)
{
    return replacements[c] || 'none';
});

如果是上述代码:

for (var i=0;i<vals.length;++i)
    results[i] = template.replace(/data\.([a-z]+)/g, function(a,c)
    {
        return vals[i][c] || 'default';
    });

你在追求什么

答案 1 :(得分:1)

如果您需要使用模板,可以使用template engine。基本上它允许您将对象绑定到模板。在场景后面,使用正则表达式解析模板。伪代码:

var template = "<span>{fullname} ({name})</span>";
var html = template({ fullname: data.fullname, name: data.name });

仅举几例:

Underscore更像是一个图书馆工具带,但它提供了一个简单的模板引擎,非常适合常用。

答案 2 :(得分:0)

目前尚不清楚您想要实现的转型是什么,但我可以告诉您,您不应该使用正则表达式来实现它!使用JSON.parse将JSON转换为JavaScript对象,直接转换对象,然后通过JSON.stringify转换回JSON。