在使用DEDECMS进行内容管理时,经常会遇到从外部网站复制内容的问题。然而,在保存这些内容时,其中的图片可能无法自动下载到本地服务器。例如,新浪博客、网易等大型网站对图片进行了防盗链处理,导致图片地址没有明确的后缀名。因此,使用DEDECMS默认的远程图片下载功能时,往往无法实现预期效果。 --- 经过分析发现,这一问题的原因在于DEDECMS在检索远程图片时使用的正则表达式中加入了图片格式的匹配规则。这意味着只有符合特定格式(如 `.gif`, `.jpg`, `.png`)的图片才会被识别并下载。然而,像新浪博客中的图片地址(例如:`http://static2.photo.sina.com.cn/orignal/54a625bft848ec4ffa561&690&690`),由于缺少明确的图片后缀名,无法被正确匹配和下载。 --- ### DEDECMS 默认的正则表达式 以下是DEDECMS中用于匹配远程图片的原始正则表达式:

preg_match_all("/(src)=[\\\\"|'| ]{0,}(http:\\\\/\\\\/([^>]*)\\\\.(gif|jpg|png))/isU", $body, $img_array);
    
可以看到,该正则表达式明确要求图片文件必须具有 `.gif`, `.jpg`, 或 `.png` 的扩展名,这使得许多特殊格式的图片无法被识别。 --- ### 解决方案 要解决这个问题,我们需要修改DEDECMS的核心文件 `/dede/inc/inc_archives_functions.php` 中的相关代码。具体步骤如下: 1. 打开文件 `/dede/inc/inc_archives_functions.php`。 2. 找到以下两个函数: - `GetCurContent($body, &$litpic, $autolitpic)` - `GetCurContent($body)` 3. 在这两个函数中,找到匹配远程图片的正则表达式部分。 4. 将原有的正则表达式替换为以下内容:

preg_match_all("/src=[\\\\"|'|\\\\s]{0,}(http:\\\\/\\\\/([^>]*))(\\\\"|'|\\\\s)/isU", $body, $img_array);
    
--- ### 修改后的效果 完成上述修改后,DEDECMS将不再依赖图片文件的扩展名来判断是否为图片。只要 `` 标签中包含有效的 `src` 属性,系统就会尝试将其作为远程资源下载到本地服务器。这样可以有效解决因图片地址缺乏明确后缀名而导致的下载失败问题。 --- ### 注意事项 尽管这种修改可以提高灵活性,但也需要注意以下几点: - **安全性**:修改后的正则表达式可能会匹配到非图片资源(如JS或FLASH文件)。如果不确定内容来源的安全性,建议手动检查下载的文件类型。 - **性能影响**:下载所有远程资源可能会增加服务器负载,尤其是在处理大量图片或其他大文件时。 --- 总之,通过调整DEDECMS的正则表达式规则,我们可以更灵活地处理各种格式的远程图片。这种方法不仅解决了图片下载问题,还提升了内容管理的效率。
为了确保系统的稳定性和安全性,请在修改前备份相关文件。
如果您还有其他疑问,欢迎继续探讨!