一段極好的js代碼如何改寫成php?

來源:互聯網
上載者:User
關鍵字 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之類的模板也內建了這種解析,為什麼還要再搞一次?

  • 相關文章

    聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.