修改帝国CMS中处理图片URL的正则表达式,使其能识别没有后缀的图片:
// 原始正则(可能类似这样):
$pattern = '/src=["\']?([^"\'>]+?\.(?:jpg|jpeg|gif|png|bmp|webp))["\']?/i';
// 修改为:
$pattern = '/src=["\']?([^"\'>]+?(?:\.(?:jpg|jpeg|gif|png|bmp|webp)|(?:\?|&)(?:[^"\'>]+?\.(?:jpg|jpeg|gif|png|bmp|webp))))["\']?/i';
// 或者更通用的版本:
$pattern = '/src=["\']?([^"\'>]+?(?:(?:\?|&)[^"\'>]*?\.(?:jpg|jpeg|gif|png|bmp|webp)|\.(?:jpg|jpeg|gif|png|bmp|webp)))["\']?/i';
修改远程保存函数,使其能够通过HTTP响应头判断文件类型:
// 在获取远程文件的函数中添加以下逻辑:
function saveRemoteImage($url, $savePath) {
// 获取HTTP头信息
$headers = get_headers($url, 1);
// 判断Content-Type
if (isset($headers['Content-Type'])) {
$contentType = strtolower($headers['Content-Type']);
// 根据Content-Type设置扩展名
$extensions = [
'image/jpeg' => 'jpg',
'image/jpg' => 'jpg',
'image/png' => 'png',
'image/gif' => 'gif',
'image/webp' => 'webp',
'image/bmp' => 'bmp',
];
if (isset($extensions[$contentType])) {
// 生成带扩展名的文件名
$filename = md5($url . time()) . '.' . $extensions[$contentType];
// 保存文件...
}
}
}
找到并修改以下文件中的相关函数:
在相关函数中添加对无后缀URL的处理:
// 在获取文件名的地方添加判断
$filename = basename($url);
// 如果文件名没有扩展名,尝试从Content-Type获取
if (!preg_match('/\.(jpg|jpeg|png|gif|bmp|webp)$/i', $filename)) {
// 获取HTTP头
$headers = @get_headers($url, 1);
if (isset($headers['Content-Type'])) {
$contentType = $headers['Content-Type'];
$ext = '';
if (strpos($contentType, 'jpeg') !== false || strpos($contentType, 'jpg') !== false) {
$ext = 'jpg';
} elseif (strpos($contentType, 'png') !== false) {
$ext = 'png';
} elseif (strpos($contentType, 'gif') !== false) {
$ext = 'gif';
} elseif (strpos($contentType, 'webp') !== false) {
$ext = 'webp';
}
if ($ext) {
$filename .= '.' . $ext;
}
}
}
如果不想修改核心文件,可以创建一个自定义函数:
// 创建自定义远程保存函数
function customSaveRemoteImage($url) {
// 临时文件名
$tempName = md5($url) . '.tmp';
// 下载文件
$content = file_get_contents($url);
file_put_contents($tempName, $content);
// 使用getimagesize判断图片类型
$imageInfo = @getimagesize($tempName);
if ($imageInfo) {
$mime = $imageInfo['mime'];
$ext = str_replace('image/', '', $mime);
$ext = str_replace('jpeg', 'jpg', $ext);
// 重命名文件
$newName = md5($url) . '.' . $ext;
rename($tempName, $newName);
return $newName;
}
return false;
}
如果是帝国CMS 7.5及以上版本,可以在后台设置:
如果上述方法都不可行,可以考虑:
最简单有效的解决方案通常是方案1(修改正则表达式)和方案2(通过Content-Type判断),建议先尝试这些方法。

