V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
CNCCTV
V2EX  ›  PHP

怎么把数据库中读出的字符串{{name}}转换成变量名?然后在页面中获取值?

  •  
  •   CNCCTV · 2015-09-20 15:18:44 +08:00 · 3469 次点击
    这是一个创建于 3343 天前的主题,其中的信息可能已经有所发展或是发生改变。
    14 条回复    2015-09-20 23:55:26 +08:00
    realpg
        1
    realpg  
       2015-09-20 15:37:18 +08:00
    最简单的办法直接 eval ……
    CNCCTV
        2
    CNCCTV  
    OP
       2015-09-20 15:54:55 +08:00
    @realpg 不懂,因为是在函数里使用正则替换的,会报未定义变量。
    guoqiao
        3
    guoqiao  
       2015-09-20 15:59:40 +08:00 via iPhone
    这不就是 django 或 jinja 的模板语法么
    foccy
        4
    foccy  
       2015-09-20 16:05:02 +08:00
    我觉得 extract 这个函数是不是能解决的这个问题?
    CNCCTV
        5
    CNCCTV  
    OP
       2015-09-20 16:36:16 +08:00
    @guoqiao 没有使用模板
    feiyuanqiu
        6
    feiyuanqiu  
       2015-09-20 17:08:52 +08:00
    get_defined_vars () 函数会获取到当前作用域已定义的变量及全局变量,返回一个键为变量名,值为变量值的数组

    你可以用这个函数实现你的需求

    $_definedVars = get_defined_vars ();
    if (asset ($_definedVars[$name])) {
    // blabla...
    }
    CNCCTV
        7
    CNCCTV  
    OP
       2015-09-20 18:00:29 +08:00
    @feiyuanqiu
    这是在函数里的替换字符串转成变量,请问怎么做?
    ```php
    $datas = preg_replace_callback ('/{{([\w\W]*?)}}/im',
    function ($matches ) {
    $matches=$matches[1];
    return $matches;
    },
    $datas[0]);
    return $datas;
    ```
    CNCCTV
        8
    CNCCTV  
    OP
       2015-09-20 18:06:13 +08:00
    @feiyuanqiu 使用 print_r (get_defined_vars ());显示出来
    Array
    (
    [matches] => Array
    (
    [0] => {{name}}
    [1] => name
    )

    )
    feiyuanqiu
        9
    feiyuanqiu  
       2015-09-20 18:12:00 +08:00 via iPhone
    @CNCCTV callback 那个匿名函数用 use 把要替换的变量传进去,在函数里直接调用对应的变量替换就行了

    手机不好打字,可能没说清楚,待会回来用代码说明
    feiyuanqiu
        10
    feiyuanqiu  
       2015-09-20 18:14:17 +08:00 via iPhone
    @CNCCTV 匿名函数是单独的作用域,要使用外部作用域的变量需要用 use 传进去
    CNCCTV
        11
    CNCCTV  
    OP
       2015-09-20 18:17:49 +08:00
    @feiyuanqiu 没看懂。。。
    feiyuanqiu
        12
    feiyuanqiu  
       2015-09-20 18:56:22 +08:00
    @CNCCTV 改了下你的代码

    // 把会用到的变量都声明好
    $vars = array (
    'name' => 'blabla',
    );

    $result = preg_replace_callback ('/{{([\w\W]*?)}}/im', function ($matches ) use ($vars ) {
    return isset ($vars[$matches[1]]) ? $vars[$matches[1]] : '';
    });
    CNCCTV
        13
    CNCCTV  
    OP
       2015-09-20 19:12:34 +08:00
    @feiyuanqiu 还要声明啊?不是自动获取全部变量吗?
    CNCCTV
        14
    CNCCTV  
    OP
       2015-09-20 23:55:26 +08:00
    @feiyuanqiu 现在算是做好了,通过传参数方式,但是还有一个新问题,如果替换的变量是一个数组,返回输出会报错,这怎么办啊?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   4500 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 100ms · UTC 01:06 · PVG 09:06 · LAX 17:06 · JFK 20:06
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.