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

PHP 判斷文章內容是否包含圖片的高效方法與實戰優化

     編輯:PHP 相關知識

在 CMS 系統、內容審核、編輯器輔助功能中,檢測 HTML 內容是否包含圖片是常見需求。本文從正則匹配、DOM 解析、性能考量三個維度,提供生產環境可用的最佳實踐方案。

方案一:正則表達式快速匹配(輕量級)

<?php
function hasImageRegex(string $html): bool
{
    // 匹配  標籤,支援單雙引號、屬性順序不固定、自閉合
    $pattern = '/]*\bsrc\s*=\s*["\']?([^"\'>\s]+)["\']?[^>]*>/i';
    return (bool)preg_match($pattern, $html);
}

// 使用示例
$content = file_get_contents('https://example.com/article/123.html');
if (hasImageRegex($content)) {
    echo "檢測到圖片";
} else {
    echo "未發現圖片";
}

正則解析

  • :匹配 img 標籤開頭,單詞邊界避免匹配 imgxyz
  • [^>]*:匹配非 > 字符(屬性區域)
  • \bsrc\s*=\s*["\']?:匹配 src 屬性,允許空格、單雙引號
  • ([^"\'>\s]+):捕獲圖片 URL(排除引號、>、空白)

方案二:DOMDocument 解析(標準化、健壯)

<?php
function hasImageDom(string $html): bool
{
    libxml_use_internal_errors(true); // 抑制 HTML5 非標準標籤警告
    $dom = new DOMDocument();
    $dom->loadHTML('' . $html, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);
    libxml_clear_errors();

    $images = $dom->getElementsByTagName('img');
    foreach ($images as $img) {
        $src = $img->getAttribute('src');
        if ($src !== '') {
            return true;
        }
    }
    return false;
}

優勢

  • 正確處理巢狀標籤、屬性順序、實體編碼、條件註釋等複雜 HTML
  • 可輕鬆擴展:獲取所有圖片 URL、alt 文本、尺寸屬性、data-src 延遲加載屬性
  • 符合 W3C 標準,維護性強

方案三:針對大文本的流式掃描(極致性能)

當處理超大 HTML(>1MB)且僅需判斷是否存在時,避免完整載入內存:

<?php
function hasImageStream(string $filePath): bool
{
    $handle = fopen($filePath, 'r');
    if (!$handle) return false;

    $bufferSize = 8192;
    $overlap = 100; // 確保跨緩衝區匹配
    $prevTail = '';

    while (!feof($handle)) {
        $chunk = fread($handle, $bufferSize);
        $searchArea = $prevTail . $chunk;

        if (preg_match('/]*\bsrc\s*=\s*["\']?[^"\'>\s]+["\']?[^>]*>/i', $searchArea)) {
            fclose($handle);
            return true;
        }

        $prevTail = substr($chunk, -$overlap);
    }
    fclose($handle);
    return false;
}

擴展:提取所有圖片信息

<?php
function extractImages(string $html): array
{
    libxml_use_internal_errors(true);
    $dom = new DOMDocument();
    $dom->loadHTML('' . $html);
    libxml_clear_errors();

    $images = [];
    foreach ($dom->getElementsByTagName('img') as $img) {
        $images[] = [
            'src' => $img->getAttribute('src'),
            'alt' => $img->getAttribute('alt'),
            'width' => $img->getAttribute('width'),
            'height' => $img->getAttribute('height'),
            'data_src' => $img->getAttribute('data-src'), // 延遲加載
            'class' => $img->getAttribute('class'),
        ];
    }
    return $images;
}

性能對比與選型建議

| 方案 | 適用場景 | 時間複雜度 | 內存佔用 | 準確率 | |------|----------|------------|----------|--------| | 正則 | 簡單判斷、中小文本、高頻調用 | O(n) | 低 | 90%+ | | DOMDocument | 需提取屬性、複雜 HTML、準確性優先 | O(n) | 中 | 99%+ | | 流式掃描 | 超大文件、僅需布爾判斷 | O(n) | 極低 | 90%+ |

實戰注意事項

  • 編碼處理:DOMDocument 載入時加 防止中文亂碼
  • 錯誤抑制:libxml_use_internal_errors(true) 避免非標準 HTML 產生警告
  • 相對路徑轉絕對:提取 src 後配合 parse_url() 和基礎 URL 補全
  • 延遲加載支持:優先檢查 data-src、data-original 等屬性
  • 背景圖片:若需檢測 CSS background-image,需解析 style 屬性或 <style> 標籤

總結

對於多數 CMS 應用,正則方案足夠高效且代碼簡潔;當需要提取圖片屬性、處理異常 HTML 或構建內容審核系統時,DOMDocument 是專業選擇。根據業務場景選擇合適方案,並注意編碼、錯誤處理、性能優化三大維度。

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