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
将函数挂到 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
将函数挂到 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之类的模板也内置了这种解析,为什么还要再搞一次?