PHP 繼承了 Perl 強大的正則表達式、C 語言的高效能,並擁有原生模板特性。本文整理三大實戰主題:模板機制、變數/陣列進階技巧、正則表達式應用。
主流 PHP 模板庫(如 PHPLIB template.inc、Smarty 前身)皆利用 preg_replace() 將標籤(如 {$var}、{loop $arr})轉換為 PHP 代碼並執行。
<?php
class SimpleTemplate {
private $vars = [];
private $template;
public function loadFile($file) {
$this->template = file_get_contents($file);
}
public function assign($key, $value) {
$this->vars[$key] = $value;
}
public function render() {
$output = $this->template;
foreach ($this->vars as $key => $val) {
$output = str_replace('{$' . $key . '}', $val, $output);
}
// 簡易迴圈支援 {loop $arr}...{/loop}
$output = preg_replace_callback(
'/\{loop\s+\$(\w+)\}(.*?)\{\/loop\}/s',
function($m) {
$arr = $this->vars[$m[1]] ?? [];
$html = '';
foreach ($arr as $item) {
$row = $m[2];
foreach ($item as $k => $v) {
$row = str_replace('{$' . $k . '}', $v, $row);
}
$html .= $row;
}
return $html;
},
$output
);
return $output;
}
}
// 使用範例
$tpl = new SimpleTemplate();
$tpl->loadFile('list.tpl');
$tpl->assign('title', '最新文章');
$tpl->assign('list', [
['id'=>1, 'name'=>'文章一'],
['id'=>2, 'name'=>'文章二'],
]);
echo $tpl->render();
?>
list.tpl 內容:
<h1>{$title}</h1>
<ul>
{loop $list}
<li>ID: {$id} - 標題: {$name}</li>
{/loop}
</ul>
$data = ['a'=>'data1', 'b'=>'data2', 'c'=>'data3'];
// each + list(舊式,PHP 7.2+ 棄用 each)
while (list($key, $val) = each($data)) {
echo "$key => $val
";
}
reset($data); // 重置指標
// foreach(推薦)
foreach ($data as $key => $val) {
echo "$key => $val
";
}
<?php
// 變數變數
$var = "this is a var";
$varname = "var";
echo $$varname; // 輸出: this is a var
// 函數變數
function fun1($str) { echo $str; }
$funname = "fun1";
$funname("This is a function!"); // 動態呼叫
// 引用傳遞(類指標行為)
function add_ref(&$a) { $a++; }
$c = 0;
add_ref($c);
echo $c; // 輸出 1(引用修改原值)
function add_val($a) { $a++; }
$c = 0;
add_val($c);
echo $c; // 輸出 0(值傳遞,不影響原值)
?>
關鍵: &$a 宣告參數為引用,函數內修改會影響外部變數,模擬 C 指標行為。
| 符號 | 含義 |
|---|---|
^ | 字串開頭 |
$ | 字串結尾 |
[0-9] | 字元集合(0-9) |
{n} | 重複 n 次 |
\d | 數字簡寫 |
<?php
$pattern = '^010\d{8}$'; // 010 開頭 + 8 位數字
$phone = '01080718828';
if (preg_match($pattern, $phone)) {
echo "北京號碼格式正確";
} else {
echo "非北京號碼或格式錯誤";
}
?>
說明: ^010$ 僅判斷前三碼,^010\d{8}$ 同時驗證總長度與格式。
模板實現關注點分離,變數/陣列技巧提升代碼靈活度,正則表達式賦予字串處理強大威力。三者結合,構成 PHP 開發者進階的核心工具箱。建議深入學習 PCRE 語法與現代模板引擎(Twig、Blade)以應對複雜專案。