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.
回複內容:
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之類的模板也內建了這種解析,為什麼還要再搞一次?