PHP文章内容图片获取函数
寻梦xunm| 7| 日常生活
2小时前

完整版PHP图片获取函数

新增开关+缺省图配置 | 支持img/MD | 校验可控 | 直接可用

/**
 * 提取文本中图片地址(支持img标签+Markdown)
 * @param string $content       源文本(html/md)
 * @param bool   $unique        是否去重,默认是
 * @param bool   $checkExists   是否校验存在开关,默认true
 * @param int    $timeout       远程校验超时(秒),默认3
 * @param string $defaultImg    不存在时显示的默认图,空则不显示
 * @return array 处理后的图片URL数组
 */
function getImagesFromContent(
    string $content,
    bool   $unique = true,
    bool   $checkExists = true,
    int    $timeout = 3,
    string $defaultImg = ''
): array {
    $images = [];
    
    // 1.匹配img标签(兼容单双引号/无引号)
    $imgPattern = '/<img[^>]+src=[\'"]?([^\'" >]+)[\'"]?/i';
    preg_match_all($imgPattern, $content, $imgMatches);
    !empty($imgMatches[1]) && $images = array_merge($images, $imgMatches[1]);

    // 2.匹配MD图片(兼容带描述/无描述/首尾空格)
    $mdPattern = '/!\[.*?\]\((\s*?.*?\s*?)\)/i';
    preg_match_all($mdPattern, $content, $mdMatches);
    !empty($mdMatches[1]) && $images = array_merge($images, $mdMatches[1]);

    // 3.基础过滤(合法路径)
    $images = array_filter($images, fn($url) => preg_match('/^(https?:\/\/|\/|\.\/|\.\.\/)/i', trim($url)));

    // 4.去重
    $unique && $images = array_values(array_unique($images));
    $images = array_map('trim', $images);
    
    // 5.存在性校验(开关可控) + 缺省图替换
    if ($checkExists) {
        $images = array_map(function($url) use ($timeout, $defaultImg) {
            return checkImageExists($url, $timeout) ? $url : ($defaultImg ?: '');
        }, $images);
        // 无默认图时过滤无效图,有则保留默认图
        if(empty($defaultImg)) $images = array_filter($images);
    }
    
    return array_values($images);
}

/**
 * 图片存在性校验(远程+本地双适配)
 */
function checkImageExists(string $url, int $timeout = 3): bool {
    if(empty($url)) return false;
    
    // 远程图(HEAD请求,高效不下载)
    if(preg_match('/^https?:\/\//i', $url)){
        $context = stream_context_create([
            'http' => ['method'=>'HEAD', 'timeout'=>$timeout, 'ignore_errors'=>true],
            'ssl'  => ['verify_peer'=>false, 'verify_peer_name'=>false]
        ]);
        $headers = @get_headers($url,1,$context);
        if(!$headers) return false;
        $status = $headers[0] ?? '';
        $type = $headers['Content-Type'] ?? '';
        return strpos($status,'200 OK')!==false && preg_match('/image\//i', $type);
    }
    
    // 本地图(补根目录+校验文件+验格式)
    $localPath = $_SERVER['DOCUMENT_ROOT'].str_replace(['//','/./'],'/',$url);
    return file_exists($localPath) && is_file($localPath) && getimagesize($localPath);
}

// curl兼容方案(allow_url_fopen禁用时用)
function checkImageExistsCurl(string $url, int $timeout=3):bool{
    if(empty($url) || !preg_match('/^https?:\/\//i',$url)) return false;
    $ch = curl_init($url);
    curl_setopt_array($ch,[
        CURLOPT_NOBODY=>true, CURLOPT_TIMEOUT=>$timeout,
        CURLOPT_SSL_VERIFYPEER=>false, CURLOPT_RETURNTRANSFER=>true
    ]);
    curl_exec($ch);
    $status = curl_getinfo($ch,CURLINFO_HTTP_CODE);
    $type = curl_getinfo($ch,CURLINFO_CONTENT_TYPE);
    curl_close($ch);
    return $status===200 && preg_match('/image\//i',$type);
}

核心新增功能
checkExists=true/false 自由开关校验,关闭则直接返回所有图
传defaultImg则无效图替换为该图,不传则自动过滤无效图
全程兼容远程/本地图,不影响原有所有功能

调用示例(3种常用场景)

<?php
$testContent = '<img src="https://picsum.photos/200"><img src="/test.jpg"><img src="https://xxx/404.jpg">![图](https://picsum.photos/300)';

// 场景1:校验开启+无默认图(过滤无效图)
$imgs1 = getImagesFromContent($testContent, true, true, 3);
var_dump($imgs1); // 只返回有效图

// 场景2:校验开启+默认图(无效图替换)
$imgs2 = getImagesFromContent($testContent, true, true, 3, 'https://xxx/default.png');
var_dump($imgs2); // 无效图替换为默认图

// 场景3:关闭校验(直接返回所有图,最快)
$imgs3 = getImagesFromContent($testContent, true, false);
var_dump($imgs3); // 不校验,全部返回

避坑提示

  1. 远程校验优先用get_headers,需开启allow_url_fopen;禁用则换checkImageExistsCurl
  2. defaultImg建议传绝对URL,避免相对路径找不到
  3. 超时设2-5秒最佳,兼顾速度与准确性
0 赞 or 打赏
喜欢就打赏一点
微信 支付宝
下一篇

没有了

站内搜索
Q Q:1340326824
邮箱:vipshiyi@qq.com
QQ群:422720328
本站没得会员制度,所有资源都有白嫖的方法,且用且珍惜! 本站相关资源来自互联网用户收集发布,仅供用于学习和交流。 如有侵权之处,请联系站长并出示相关证明以便删除,敬请谅解!

我的音乐