提取文章第一张图片作为文章缩略图(最常用)
这是最经典的需求,通常用于首页、列表页的文章摘要,显示一张代表性的图片。

(图片来源网络,侵删)
方法1:使用DedeCMS自带的 {dede:img} 标签(推荐)
这是最简单、最官方、最高效的方法,直接在模板中使用标签即可,无需修改PHP代码。
使用方法:
在需要显示缩略图的地方(如 arclist.htm, list_article.htm, article_article.htm 等),将原来的缩略图标签:
[field:picname/]
替换为:
{dede:img text='' width='100' height='100'}[field:body/]{/dede:img}

(图片来源网络,侵删)
参数说明:
text='': 图片的替代文本,可以留空或填写描述。width='100': 提取图片的显示宽度(像素)。height='100': 提取图片的显示高度(像素)。[field:body/]: 这是关键,它会指向文章的内容正文,{dede:img}标签会在这个正文中查找第一张符合尺寸的图片。ismake='yes'(可选): 如果你想强制提取并生成新的缩略图文件,可以加上这个参数,通常情况下,直接使用即可。
示例:
<li>
<a href="[field:arcurl/]">
<!-- 使用 {dede:img} 提取文章第一张图 -->
{dede:img text='[field:title]' width='150' height='100'}[field:body/]{/dede:img}
</a>
<h3><a href="[field:arcurl/]">[field:title/]</a></h3>
</li>
优点:
- 无需修改代码:纯模板操作,安全、简单。
- 性能高:标签在页面生成时由DedeCMS解析,效率高。
- 自动处理:会自动处理图片路径。
方法2:修改 include/inc_arclist_view.php 文件(不推荐,仅作了解)
如果官方标签无法满足你的特殊需求(比如想获取图片地址而不是生成图片),可以修改这个文件。但请注意,修改核心文件在升级时可能会被覆盖,不推荐新手使用。

(图片来源网络,侵删)
- 打开文件
/include/inc_arclist_view.php。 - 找到大约在第236行左右的
InnerText处理部分。 - 在
$this->Fields['imgsrc'] = '';这一行下面,添加以下PHP代码:
// 获取文章第一张图片
if (preg_match_all("/<img([^>]*)\s*src=('|\")([^'\"]+)('|\")/i", $this->Fields['body'], $matches)) {
if (isset($matches[3][0])) {
$this->Fields['imgsrc'] = $matches[3][0]; // 将第一张图片地址赋给 imgsrc 字段
}
}
保存文件。
使用方法:
添加完代码后,你就可以在模板中使用 [field:imgsrc/] 来调用文章第一张图片的地址了。
<img src="[field:imgsrc/]" alt="[field:title/]" />
缺点:
- 修改核心文件:升级DedeCMS时可能会丢失修改。
- 安全性:直接操作正则表达式,如果规则不严谨可能会有问题。
提取文章中的所有图片,制作图集或图文列表
如果你想在文章详情页或列表页显示文章包含的所有图片,可以使用 {dede:img} 的 listimg 属性。
使用方法:
在模板中,使用以下标签:
{dede:img listimg='yes' width='100' height='100'}[field:body/]{/dede:img}
参数说明:
listimg='yes': 这是核心参数,表示提取文章中的所有图片,而不仅仅是第一张。
示例(在文章详情页 article_article.htm 中显示所有图片):
<div class="article-images">
<h3>文章图片</h3>
{dede:img listimg='yes' width='200' height='150'}[field:body/]{/dede:img}
</div>
这会输出文章里所有的 <img> 标签,并按照你设定的宽高进行显示。
在PHP代码中提取图片(用于二次开发)
如果你在编写自定义的PHP文件或插件时需要提取图片,可以直接使用正则表达式。
示例代码:
<?php
// 假设 $article_body 是文章的正文内容
$article_body = '<p>这是一段文字,<img src="/uploads/2025/10/01/image1.jpg" alt="图片1">中间有张图片。</p><p>后面还有一张<img src="/uploads/2025/10/02/image2.png" alt="图片2">。</p>';
// 正则表达式,匹配 img 标签中的 src 属性
$pattern = '/<img[^>]*src=["\']([^"\']+)["\'][^>]*>/i';
// 执行匹配
preg_match_all($pattern, $article_body, $matches);
// $matches[1] 将包含所有找到的图片地址
if (isset($matches[1]) && !empty($matches[1])) {
echo "找到的图片:<br>";
foreach ($matches[1] as $img_src) {
echo $img_src . "<br>";
}
// 获取第一张图片
$first_image = $matches[1][0];
echo "<br>第一张图片是:" . $first_image;
} else {
echo "文章中没有找到图片。";
}
?>
输出结果:
找到的图片:
/uploads/2025/10/01/image1.jpg
/uploads/2025/10/02/image2.png
第一张图片是:/uploads/2025/10/01/image1.jpg
总结与建议
| 需求场景 | 推荐方法 | 优点 | 缺点 |
|---|---|---|---|
| 提取文章第一张图作为缩略图 | 方法1:{dede:img} |
最简单、最安全、性能最高 | 功能相对固定,灵活性稍差 |
| 提取文章所有图片 | 方法2:{dede:img listimg='yes'} |
简单、直接 | - |
| 在PHP代码中提取图片 | 方法3:PHP正则表达式 | 灵活、强大,适合二次开发 | 需要一定的PHP编程能力 |
对于绝大多数用户,强烈推荐使用方法1和方法2,它们能解决90%以上的需求,并且安全可靠。 只有在进行深度二次开发时,才需要考虑使用方法3。
