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

PHP 新聞編輯時智能刪除舊圖片:實作邏輯與程式碼

     編輯:PHP 綜合知識

後台編輯新聞時,使用者可能刪除、新增或保留圖片。需比對「舊內容」與「新內容」的圖片集合,刪除不再被引用的舊圖檔。

核心邏輯:集合差集運算

  1. 從舊內容 $old_contents 解析所有圖片檔名 → 陣列 $oldPic
  2. 從新內容 $content 解析所有圖片檔名 → 陣列 $nowPic
  3. 取交集 $intersectPic = array_intersect($nowPic, $oldPic) → 仍被引用的圖片
  4. 遍歷 $oldPic,若不在交集中 → unlink() 刪除實體檔案

完整實作程式碼

<?php
// 1. 解析舊內容圖片
$oldPic = [];
preg_match_all('/<IMG(.*?)src="(.*?)">/i', $old_contents, $match);
if (!empty($match[2])) {
    foreach ($match[2] as $val) {
        $oldPic[] = basename($val);
    }
}

// 2. 解析新內容圖片
$nowPic = [];
preg_match_all('/<IMG(.*?)src="(.*?)">/i', $content, $testpic);
if (!empty($testpic[2])) {
    foreach ($testpic[2] as $val) {
        $nowPic[] = basename($val);
    }
}

// 3. 計算交集(保留的圖片)
$intersectPic = array_intersect($nowPic, $oldPic);

// 4. 刪除不在交集中的舊圖片
foreach ($oldPic as $val) {
    if (!in_array($val, $intersectPic)) {
        $delPath = "圖片路徑/" . $val; // 實際專案請用絕對路徑常數
        if (file_exists($delPath)) {
            unlink($delPath);
        }
    }
}

正則表達式說明

/<IMG(.*?)src="(.*?)">/i

  • i:不區分大小寫(匹配 <img>、<IMG>)
  • (.*?):非貪婪匹配屬性,確保正確捕獲 src
  • 僅提取 src 屬性值,再用 basename() 取純檔名

健壯性加強建議

支援單引號 src
正則擴展:/<IMG(.*?)src=([\"'])(.*?)\2>/i
相對/絕對路徑正規化
統一轉為相對上傳目錄的路徑再比對
資料庫關聯驗證
若圖片表獨立存放,優先查詢資料庫引用計數,避免誤刪被其他文章引用的圖片
軟刪除機制
先標記 deleted_at,定期清理任務再真正 unlink,防誤刪可恢復

效能考量

正則解析 HTML 屬於「脆弱解析」,大型內容建議改用 DOMDocument 或 DOMXPath 解析,雖稍慢但極大幅度降低誤匹配風險。

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