2013-05-13 74 views
1

我有HTML与标记的字符串内保存在数据库中如内的一切:提取括号

<p>Hello {$name}, welcome to {$shop_name}....</p> 

我想通过所有可用的那一刻我循环替换所有与实际数据的标签,现在数据并且如果存在则进行替换。

foreach($data as $key => $data){ 
    $content = str_replace('{$'.$key.'}', $data, $content); 
} 

是否有这样做没有通过所有$data的循环的更好的办法?现在这个数字增长到5000多行。

我的意思是有可能提取所有变量{$ name}/{$ shop_name}然后做一个替换只发现?

+0

为什么不使用现成的现成模板系统? – dtech 2013-05-13 16:14:13

+0

是的,我基于Smarty的语法,虽然我不想要一个庞大的模板系统,只是一些替换的变种 – 2013-05-13 16:15:03

回答

3

您可以通过单个str_replace调用。

$find = array(); 
$replace = array(); 
foreach($data as $key => $data) { 
    $find[] = "\{$" . $key . "}"; 
    $replace[] = $data; 
} 
$content = str_replace($find, $replace, $content); 

除非存在真正的性能问题,否则我不会担心它太多。

+0

完美,我不相信我永远不知道它可以接受数组。注意使用语法错误{inside“ – 2013-05-13 16:19:08

+1

啊,只是转义它。如果这样做不起作用,跳出窗口,同时诅咒PHP程序员。 – Halcyon 2013-05-13 16:19:41

+2

@JohnMagnolia您可以随时在PHP手册中自己查看这些类型的东西: php.net/functionname(例如http://php.net/str_replace) – dtech 2013-05-13 16:24:02

0

可以做

$content = preg_replace('/\{$(\w+)\}/e', '$data[\'$1\']', $content); 
+0

这不完全等价,它也会尝试替换'{$ doesntexist}',并且正则表达式可能会慢得多 – Halcyon 2013-05-13 16:18:58

+0

而'/ e' – nickb 2013-05-13 16:21:54

1

str_replace接受数组,你可以建立阵列array_keysarray_values和用户array_map添加{$}

$content = str_replace(
       array_map(function($e) { return '{$' . $e . '}';}, array_keys($data)), 
       array_values($data), 
       $content); 
+1

不考虑'{$ ..}'模板部分,您需要先构建匹配数组。 – Halcyon 2013-05-13 16:16:53

+0

好点,但可以使用'array_map'来完成我的意见比建立自己更优雅,加上回答 – dtech 2013-05-13 16:17:55

+0

感谢@dtech非常酷你怎么能在1行上做到这一切尽管我发现其他解决方案对于我的基础更具可读性现在的水平 – 2013-05-13 16:41:38