(php) 一段极好的js代码如何改写成php?

hsfzxjy的这个“17 行代码实现的简易 Javascript 字符串模板”在前端很有用,想请教各位大大php版本的应该怎么改写。

function rendertemplate, context { var tokenReg = /\?{[^{}\]+\?}/g; return template.replacetokenReg, 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 renderthis, context;
};

之后,我们便可以这样调用啦:

"{greeting}! My name is { author.name }.".render{ greeting: "Hi", author: { name: "hsfzxjy" }
};
// Hi! My name is hsfzxjy.

补充一下,内置函数 strtr 做的事情几乎一摸一样,出了没有支持点语法访问多层之外

<?php echo strtr"{greeting}! My name is {author.name}.", array {greeting} => 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之类的模板也内置了这种解析,为什么还要再搞一次?

发表评论

电子邮件地址不会被公开。 必填项已用*标注