PHP Preg Replace替换数组

3

好的,我想要实现以下功能:

preg_replace("/\{([a-zA-Z0-9_]+)\}/", $templateVariables[$1], $templateString);

现在我知道这样做是不可能的,但我想知道是否有一种方法可以实现这个功能。因为我尝试使用create_function,但$templateVariables是一个局部变量,无法从create_function中访问,所以我陷入了困境。我不想手动找到匹配项并替换它们,再找到它们以进行替换,这似乎非常低效。所以是否有办法可以从匿名函数中访问局部变量,或者是否有其他好的建议。

谢谢。

3个回答

4

试试这个:

$vars = array(
    "test" => "Merry Christmas",
);
$string = "test {test} test";
$string = preg_replace_callback("/\{([a-zA-Z0-9_]+)\}/", function($match) use ($vars) {
    return isset($vars[$match[1]]) ? $vars[$match[1]] : $match[0];
}, $string);
echo $string;

它应该输出:

测试快乐圣诞节测试

您可以在此处查看一个工作示例http://codepad.viper-7.com/2ZNNYZ


这是一个相当不错的技巧。有没有一种方法可以使用命名回调函数来实现这个? - CrayonViolent
定义回调函数,然后将其名称作为字符串放置在那里。 - hakre
@hakre:我不明白。我知道你可以使用preg_replace_callback("pattern","someFunction","subject");,然后有一个单独的function someFunction ($matches) {...},但例如,您无法执行preg_replace_callback("pattern","someFunction($someVar)","subject");,我的问题是是否有方法可以做到这一点。好吧,这实际上是OP的问题。 我想我的问题是...您可以使用“use”将变量传递给匿名函数,如此答案所示。但是,例如,您是否可以执行 preg_replace_callback("pattern","someFunction" use ($someVar) ,"subject"); - CrayonViolent
@CrayonViolent preg_replace_callback("pattern",function($m) use ($someVar) { call_some_other_function($someVar, $m); },"subject"); 而且,不,原问题是“我能否使用匹配作为数组索引进行 preg_replace” - Petah
有没有这个 use 使用的文档,我可以看一下?我只是想看看我错过了什么。 - csteifel
Petah:嗯,我知道你可以那样做,但我想可能有一种更直接的方法我没想到。@legion:http://us2.php.net/manual/en/functions.anonymous.php 参见示例#3。 - CrayonViolent

-1

你实际上可以使用带有 /e 修饰符的 preg_replace 函数:

preg_replace("/\{([a-zA-Z0-9_]+)\}/e", '$templateVariables[\'$1\']', $templateString)

但这可能不是这里最安全的方式...


-1
你需要使用 e 正则表达式修饰符:
preg_replace("/\{([a-zA-Z0-9_]+)\}/e", "\$templateVariables['\\1']", $templateString);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接