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

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

本条技术文章来源于互联网,如果无意侵犯您的权益请点击此处反馈版权投诉

本文系统来源:php中文网

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值