javascript - 用正则表达式动态替换值

标签 javascript regex

我在表单中有一些数据

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

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

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

我的问题如下:

  • 我必须寻找所有的“数据”。在字符串中,
  • 获取其后的值(在本例中为全名和姓名),
  • 并替换数据。与我的外部资源。例如

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

在 Javascript 中。

谢谢!

编辑:我可能解释错了。我的来源已定义(在本例中,是 JSON 格式的名称/全名列表)。我也有一个模板可以遵循。我必须用源的对应值替换模板中使用的语法(即“数据”。['数据'是固定的])。希望现在更清楚了!

再次感谢!

最佳答案

使用字符串的简单 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]+):再一次:匹配并捕获 1 个或多个字符较远的数据。 -> “数据。”
  • g:是全局标志,将这个pattern应用到整个字符串。

现在,对于找到的此模式的每个匹配项,我没有提供替换字符串,而是提供了一个函数,将匹配的子字符串(和捕获的组作为单独的参数)传递给该函数,并使用该函数构造一个替换字符串字符串:

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

是你想要的

关于javascript - 用正则表达式动态替换值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20739977/

相关文章:

javascript - 是否可以从浏览器发送 ipp 打印作业?

循环内的 JavaScript 闭包 – 简单的实际示例

javascript - 将 KeyParam 替换为动态 JSON - 继续问题 - 57833909

javascript - 选择性提交表单元素

ruby - 用于将字符串与 ruby​​ 中的数字匹配的正则表达式

Java Regex matches() 返回 false 但在浏览器中有效

regex - 从网页递归下载 zip 文件 (Windows)

javascript - 合并和定位两个媒体流

C# 的正则表达式不能像我想要的那样工作

Python:正则表达式搜索