Grunt替换编译的电子邮件模板

时间:2015-12-12 17:20:07

标签: php regex gruntjs

我正在使用Lee Munroe的grunt-email-workflow为没有模板引擎的PHP框架构建一组电子邮件模板,即:它使用原始php变量<?= $firstname; ?>等,在模板中。

一切顺利,直到我尝试在电子邮件源中实现这些变量,然后我发现assemble会在遇到变量时发生错误并引发错误。

此项目的gruntfile已包含grunt-replace,因此我的想法是对handlebars ## item ##之类的{{ item }}解析的文字进行替换,把它变成大括号replacement,然后我可以在PHP应用程序上使用Twig来解析PHP。

我的问题是我无法解析grunt-replace的{​​{1}}部分。

我发现this article做了类似于我想要的事情,但替换功能不会为此工作。

到目前为止,我有这个:

replace: {
    dist: {
        options: {
            usePrefix: false,
            patterns: [
                {
                    match: /\##[^##]*\##/g,
                    replacement: ???????
                }
            ]
        },
        files: {
          expand: true,
          flatten: true,
          src: ['<%= paths.dist %>/**/*.html'],
          dest: '<%= paths.dist %>/'
        },
    }
}

更新

经过一些额外的尝试后,我有了这个:

replace: {
    dist: {
        options: {
            usePrefix: false,
            patterns: [
                {
                  match: /\##[^##]*\##/g,
                  replacement: '{{ $1 }}'
                }
            ]
        },
        files: [
            {
              expand: true,
              flatten: true,
              src: ['<%= paths.dist %>/front/*.html'],
              dest: '<%= paths.dist %>/front/'
            },
            {
              expand: true,
              flatten: true,
              src: ['<%= paths.dist %>/back/*.html'],
              dest: '<%= paths.dist %>/back/'
            }
        ]
    }
}

在我编译的模板中,## firstname ##现已替换为{{ $1 }}

如何获取匹配标签中内容的值以进行替换?

1 个答案:

答案 0 :(得分:1)

您只需要在捕获值所需的模式周围使用捕获组(圆括号,圆括号),以及一个与##到最接近的##的任意数量的符号匹配的构造:

要么使用惰性构造:

match: /##([^#]*(?:#(?!#)[^#]*)*)##/g

或者使用它的展开版本:

match: /##([\s\S]*?)##/g