2013-05-13 76 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