【问题标题】:Replacing preg_replace with preg_replace_callback用 preg_replace_callback 替换 preg_replace
【发布时间】:2015-08-09 07:45:29
【问题描述】:

我正在尝试重写这个函数

<?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"] ,所以我显然做错了什么。即使在阅读了文档之后,我也并不真正了解我在做什么。谁能帮帮我?

【问题讨论】:

  • 你想要那个:'$vars["$1"]' 这被解释为字符串还是变量? (也将:'$vars["$1"]' 更改为:'$vars["' . $matches[1] . ']',因为您的匹配项在 $matches
  • 它应该用 $vars['data'] 替换 @data 之类的东西。感谢您尝试帮助我。

标签: php


【解决方案1】:

在下面尝试,如果在$vars 中找不到索引foo,它将保留@foo

还需要使用use ($vars)$vars导入到回调函数的作用域中。

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

【讨论】:

  • 1.没有解释,您更改了什么以及更改代码的原因; OP 做错了什么以及如何做 2. 目前尚不清楚他是否想要 $vars 中的值或只是一个字符串。来自一个 94k 的人,答案真的很差
  • 好的,这行得通。感谢您的帮助,现在我将尝试剖析您的代码以更好地理解。
猜你喜欢
  • 1970-01-01
  • 2014-02-19
  • 2013-03-05
相关资源
最近更新 更多