首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP 正則替換處理 HTML 頁面資源路徑:CodeIgniter 專案實戰模式

     編輯:PHP 綜合知識

在 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() 內路徑

核心處理流程

  1. 初始化:載入對應模組 Model (mupload_data、taskdata 等)。
  2. 路徑標準化:處理 ../ 相對路徑、移除錨點 #...、去除引號。
  3. 資源查找:呼叫 Model get_id_by_path_and_project($path, $pid) 取得資源 ID。
  4. 路由重寫:根據模組 (udata/tdata/tresult/dresult) 生成對應控制器 URL,如 /cdms/udata/picfile/{id}?pid={pid}。
  5. 回退機制:找不到資源 ID 時保留原屬性值,確保頁面不斷裂。
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',
            '/]+?)/i' => 'iframe_replace',
            '/]+?)/i' => 'frame_replace',
            '/window\.open\((.+?)\)/i' => 'js_replace',
            '/background(.+?)url\((["\' ]?)(.+?)(["\' ]?)\)/i' => 'css_replace',
        ];

        foreach ($patterns as $pattern => $callback) {
            $this->content = preg_replace_callback($pattern, [$this, $callback], $this->content);
        }
        return $this->content;
    }

    // 各 _replace 方法邏輯相似:解析路徑 → 查 ID → 重組標籤
    private function image_replace($m) { /* ... 參考原碼 ... */ }
    private function html_replace($m) { /* ... */ }
    private function iframe_replace($m) { /* ... */ }
    private function frame_replace($m) { /* ... */ }
    private function js_replace($m) { /* ... */ }
    private function css_replace($m) { /* ... */ }
}

架構優化建議

🔧 現代化重構方向
  • DOM 解析器替代正則:使用 DOMDocument + DOMXPath 遍歷節點屬性,避免正則處理巢狀/異常 HTML 的脆弱性。
  • 服務層解耦:將資源查找邏輯移至 Repository/Service 類別,Controller 僅協調流程。
  • 快取機制:對同一專案、相同路徑的查找結果加入 Redis 快取,減少 DB 查詢。
  • 單元測試:建立各種邊界 HTML 片段(含單雙引號、無引號、相對/絕對路徑、錨點、查詢字串)作為測試固件。

此類別展示了在框架專案中如何集中處理 HTML 資源路徑重寫,是內容管理系統、文檔轉換工具的常見模式。掌握其核心邏輯並遷移至更健壯的 DOM 操作架構,能顯著提升系統穩定性與維護性。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved