Home > Backend Development > PHP Tutorial > 一段极好的js代码如何改写成php?

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

WBOY
Release: 2016-06-06 20:13:34
Original
1041 people have browsed it

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

<code>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 </code>
Copy after login
Copy after login

将函数挂到 String 的原型链

<code>String.prototype.render = function (context) {
    return render(this, context);
};</code>
Copy after login
Copy after login

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

<code>"{greeting}! My name is { author.name }.".render({
    greeting: "Hi",
    author: {
        name: "hsfzxjy"
    }
});
// Hi! My name is hsfzxjy.</code>
Copy after login
Copy after login

回复内容:

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

<code>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 </code>
Copy after login
Copy after login

将函数挂到 String 的原型链

<code>String.prototype.render = function (context) {
    return render(this, context);
};</code>
Copy after login
Copy after login

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

<code>"{greeting}! My name is { author.name }.".render({
    greeting: "Hi",
    author: {
        name: "hsfzxjy"
    }
});
// Hi! My name is hsfzxjy.</code>
Copy after login
Copy after login

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

<code class="php"><?php echo strtr("{greeting}! My name is {author.name}.", array(
    '{greeting}' => 'Hi',
    '{author.name}' => 'hsfzxjy',
));</code>
Copy after login

另外,javascript中修改内置对象的原型链是绝对不能做的事情

只是一段简单的字符串替换,用php的话写大概12行,如下:

<code class="php">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);
}</code>
Copy after login

使用也是相同的

<code>$data = array(
    "greeting"=> "Hi",
    "author"=>array("name"=>"hsfzxjy"));

echo render("{greeting}! My name is { author.name }.",$data);
// Hi! My name is hsfzxjy.</code>
Copy after login

在php这边貌似没用,如果需要的话搜索一下就行了。通常php只要写成 "{$greeting}! My name is {$author['name']}就行了,还解析一次干什么。smarty之类的模板也内置了这种解析,为什么还要再搞一次?

Related labels:
php
source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template