3

好了,所以我试图做一些事情,像这样:PHP的Preg更换更换阵列

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

现在我知道这是不可能的喜欢它,但是我想知道是否有一个方法来做到这一点,因为我试图使用create_function,但是$ templateVariables是它所在函数的局部变量,所以我不能从create_function中访问$ templateVariables,所以我有点卡在这里。我宁愿不必找到匹配什么来替换它们,然后再次找到它们来取代,这似乎是可怕的低效率。那么,无论如何,我可以从一个匿名函数中获取局部变量,或者是否有任何人有任何好的建议。

谢谢。

回答

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

+0

非常漂亮的把戏。有没有办法做到这一点与命名回调函数? – 2011-12-23 02:07:30

+0

定义回调函数,并将其名称作为字符串放在那里。 – hakre 2011-12-23 02:25:57

+0

@hakre:我不明白。我知道你可以做'preg_replace_callback(“pattern”,“someFunction”,“subject”);'然后有一个单独的'function someFunction($ matches){...}'但是例如你不能'preg_replace_callback(“模式“,”someFunction($ someVar)“,”主题“);'我的问题是,如果有办法做到这一点。那么,这真是OP的问题。我想我的问题是...你可以通过使用“use”将var传递给匿名函数,如此答案中所示。但你可以做例如'preg_replace_callback(“pattern”,“someFunction”use($ someVar),“subject”);' – 2011-12-23 02:30:17

-1

您可以实际使用的preg_replace与/ e修饰符:

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

但它可能不会在这里最安全的方式...

-1

您需要使用电子正则表达式修改:

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