完整版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">';
// 场景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); // 不校验,全部返回避坑提示
- 远程校验优先用get_headers,需开启allow_url_fopen;禁用则换checkImageExistsCurl
- defaultImg建议传绝对URL,避免相对路径找不到
- 超时设2-5秒最佳,兼顾速度与准确性














