时间:2021-07-01 10:21:17 帮助过:23人阅读
function render(template, context) {
var tokenReg = /(\\)?\{([^\{\}\\]+)(\\)?\}/g;
return template.replace(tokenReg, function (word, slash1, token, slash2) {
if (slash1 || slash2) {
return word.replace('\\', '');
}
var variables = token.replace(/\s/g, '').split('.');
var currentObject = context;
var i, length, variable;
for (i = 0, length = variables.length; i < length; ++i) {
variable = variables[i];
currentObject = currentObject[variable];
if (currentObject === undefined || currentObject === null) return '';
}
return currentObject;
})
}
将函数挂到 String 的原型链
String.prototype.render = function (context) {
return render(this, context);
};
之后,我们便可以这样调用啦:
"{greeting}! My name is { author.name }.".render({
greeting: "Hi",
author: {
name: "hsfzxjy"
}
});
// Hi! My name is hsfzxjy.
hsfzxjy的这个“17 行代码实现的简易 Javascript 字符串模板”在前端很有用,想请教各位大大php版本的应该怎么改写。
function render(template, context) {
var tokenReg = /(\\)?\{([^\{\}\\]+)(\\)?\}/g;
return template.replace(tokenReg, function (word, slash1, token, slash2) {
if (slash1 || slash2) {
return word.replace('\\', '');
}
var variables = token.replace(/\s/g, '').split('.');
var currentObject = context;
var i, length, variable;
for (i = 0, length = variables.length; i < length; ++i) {
variable = variables[i];
currentObject = currentObject[variable];
if (currentObject === undefined || currentObject === null) return '';
}
return currentObject;
})
}
将函数挂到 String 的原型链
String.prototype.render = function (context) {
return render(this, context);
};
之后,我们便可以这样调用啦:
"{greeting}! My name is { author.name }.".render({
greeting: "Hi",
author: {
name: "hsfzxjy"
}
});
// Hi! My name is hsfzxjy.
补充一下,内置函数 strtr 做的事情几乎一摸一样,出了没有支持点语法访问多层之外
'Hi',
'{author.name}' => 'hsfzxjy',
));
另外,javascript中修改内置对象的原型链是绝对不能做的事情
只是一段简单的字符串替换,用php的话写大概12行,如下:
function render($template, $arr) {
$reg = "/(\\\)?\{([^\{\}\\\]+)(\\\)?\}/s";
return preg_replace_callback($reg, function ($m) use ($arr) {
if (!empty($m[1])||!empty($m[3])||empty($m[2])) return str_replace("\\", '', $m[0]);
$variables = explode('.', preg_replace("/\s/", '', $m[2]));
foreach ($variables as $variable) {
$arr = isset($arr[$variable])?$arr[$variable]:null;
if (!$arr) return '';
}
return $arr;
}, $template);
}
使用也是相同的
$data = array(
"greeting"=> "Hi",
"author"=>array("name"=>"hsfzxjy"));
echo render("{greeting}! My name is { author.name }.",$data);
// Hi! My name is hsfzxjy.
在php这边貌似没用,如果需要的话搜索一下就行了。通常php只要写成 "{$greeting}! My name is {$author['name']}就行了,还解析一次干什么。smarty之类的模板也内置了这种解析,为什么还要再搞一次?