用preg_replace_callback替换preg_replace

时间:2015-05-27 09:47:00

标签: php

我试图重写此功能

<?php
    $vars = array('id'=>$_SESSION['id'], 'name' => $_SESSION['username'],
'time' => $time->format('Y-m-d H:i:s');
    $filename = "@name - @time";
    echo preg_replace('/@(\w+)/e', '$vars["$1"]', $filename);
    ?>

到目前为止,这是我得到的地方

<?php
    $vars = array('id'=>$_SESSION['id'], 'name' => $_SESSION['username'],
'time' => $time->format('Y-m-d H:i:s');
    $filename = "@name - @time";
    echo preg_replace_callback('/@(\w+)/', function ($matches) {return '$vars["$1"]';}, $filename);
    ?>

但这只显示我$vars["$1"] - $vars["$1"],所以我显然做错了什么。即使阅读完文档后我也不能理解我的所作所为。任何人都可以帮助我吗?

1 个答案:

答案 0 :(得分:0)

请尝试以下操作,如果在@foo中找不到索引foo,则会保留$vars

您还需要使用use ($vars)$vars导入回调函数范围。

echo preg_replace_callback('/@(\w+)/', function($matches) use ($vars) {
  return isset($vars[$matches[1]]) ? $vars[$matches[1]] : '@'.$matches[1];
}, $filename);