在 CMS、編輯器輸出或靜態頁面遷移場景中,常需將 HTML 中的相對資源路徑(圖片、連結、iframe、CSS 背景、JS 彈窗)重寫為動態控制器路由。本文展示一個 Myreplace 類別,專為 CodeIgniter 框架設計,透過 preg_replace_callback 針對六類資源標籤進行路徑解析、專案 ID 綁定、模組路由重寫,實現資源統一管理與權限控制。
| 資源類型 | 正則模式 (簡化) | 目標屬性 |
|---|---|---|
| 圖片 | <img.*?src=... | src |
| 超連結 | <a.*?href=... | href |
| Iframe | <iframe.*?src=... | src |
| Frame | <frame.*?src=... | src |
| JS 彈窗 | window.open(...) | 第一參數 |
| CSS 背景 | background.*?url(...) | url() 內路徑 |
mupload_data、taskdata 等)。../ 相對路徑、移除錨點 #...、去除引號。get_id_by_path_and_project($path, $pid) 取得資源 ID。udata/tdata/tresult/dresult) 生成對應控制器 URL,如 /cdms/udata/picfile/{id}?pid={pid}。class Myreplace {
private $moudle_array = ['udata','tdata','tresult','dresult'];
private $content, $relative_dirname, $projectid, $moudle;
private $CI;
public function __construct() { $this->CI =& get_instance(); }
public function my_replace($content, $relative, $projectid, $moudle) {
$this->content = $content;
$this->relative_dirname = $relative;
$this->projectid = $projectid;
$this->moudle = in_array(strtolower($moudle), $this->moudle_array) ? $moudle : exit;
// 載入對應 Model
$model_map = [
'udata' => 'mupload_data', 'tdata' => 'taskdata',
'tresult' => 'taskresult', 'dresult' => 'dmsresult'
];
$this->CI->load->model($model_map[$this->moudle], 'model');
// 依序處理六類資源
$patterns = [
'/
]+?)/i' => 'image_replace',
'/]+?)/i' => 'html_replace',
'/
DOMDocument + DOMXPath 遍歷節點屬性,避免正則處理巢狀/異常 HTML 的脆弱性。此類別展示了在框架專案中如何集中處理 HTML 資源路徑重寫,是內容管理系統、文檔轉換工具的常見模式。掌握其核心邏輯並遷移至更健壯的 DOM 操作架構,能顯著提升系統穩定性與維護性。