Heim >Backend-Entwicklung >PHP-Tutorial >一段极好的js代码如何改写成php?

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

WBOY
WBOYOriginal
2016-06-06 20:13:341023Durchsuche

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>

将函数挂到 String 的原型链

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

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

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

回复内容:

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>

将函数挂到 String 的原型链

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

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

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

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

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

另外,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>

使用也是相同的

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

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

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

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn