欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  后端开发

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

程序员文章站 2022-04-29 16:03:07
...
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之类的模板也内置了这种解析,为什么还要再搞一次?

相关标签: php