首页 > 解决方案 > 如何从模板中提取车把列表?

问题描述

给定一个带有有效把手的字符串,例如"Handlebars <b>{{doesWhat}}</b>",我知道我可以使用它来编译它,Handlebars.compile因此我可以doesWhat使用以下代码注入一个变量:

const template = Handlebars.compile("Handlebars <b>{{doesWhat}}</b>");
const rendered = template({ doesWhat: "rocks!" });
// returns "Handlebars <b>rocks!</b>"

我想知道是否有办法提取库编译时检测到的所有把手的列表(不包括注释、助手或“语言”的其他功能)?会返回的东西:

['doesWhat']

标签: javascripthandlebars.js

解决方案


您应该匹配 和 内的任何"{{"内容"}}"。这不考虑诸如循环和中继器之类的事情。

我添加了向后看和向前看检查。请记住,旧版本的 JavaScript 不支持负向回溯。

Handlebars.registerHelper('loud', str => str.toUpperCase())

const EXPRESSION_PATTERN = /(?<=\{\{)[\{]?(.*?)[\}]?(?=\}\})/g
const extractExpressions = template => format.match(EXPRESSION_PATTERN)

let format  = '{{name}} <b>{{loud does}}</b> my <b>{{thing.value}}</b>!'
let options = { name: 'Handlebars', does: 'rocks', thing: { value: 'socks' }}
let template = Handlebars.compile(format)

console.log(extractExpressions(template))
document.querySelector('#rendered').innerHTML = template(options)
<script src="https://cdnjs.cloudflare.com/ajax/libs/handlebars.js/4.7.6/handlebars.min.js"></script>
<div id="rendered"></div>


推荐阅读