使用 {dede:field.body} + 自定义函数(最推荐、最灵活)
这是最强大和最灵活的方法,因为它可以处理文章内容中的任意图片,而不仅仅是缩略图,它的核心思路是:
- 先用
{dede:field.body}获取文章的完整内容。 - 在模板文件中引入一个自定义的PHP函数。
- 在模板里调用这个函数,并传入文章内容,函数会返回处理后的图片名称。
步骤详解:
创建自定义函数文件
在你的网站根目录下,找到 include/extend.func.php 文件,如果这个文件不存在,就自己新建一个,在这个文件里添加下面的PHP代码:
/**
* 获取文章内容中的第一张图片的文件名
* @param string $body 文章内容
* @return string 图片的文件名(不带后缀)或空字符串
*/
function GetFirstImgName($body)
{
// 匹配 img 标签的正则表达式
$pattern = '/<img\s[^>]*?src\s*=\s*['"]?([^"'\s>]+)['"]?[^>]*>/i';
preg_match_all($pattern, $body, $matches);
if (isset($matches[1]) && !empty($matches[1])) {
// 获取第一个图片的 src
$first_img_src = $matches[1][0];
// 从 src 中提取文件名
$img_path_info = pathinfo($first_img_src);
// 返回不带后缀的文件名,如果需要带后缀,可以返回 $img_path_info['basename']
return $img_path_info['filename'];
}
return '';
}
/**
* 获取文章内容中所有图片的文件名(逗号分隔)
* @param string $body 文章内容
* @return string 图片文件名列表(逗号分隔)
*/
function GetAllImgNames($body)
{
$pattern = '/<img\s[^>]*?src\s*=\s*['"]?([^"'\s>]+)['"]?[^>]*>/i';
preg_match_all($pattern, $body, $matches);
$img_names = [];
if (isset($matches[1]) && !empty($matches[1])) {
foreach ($matches[1] as $src) {
$img_path_info = pathinfo($src);
$img_names[] = $img_path_info['filename']; // 同样,这里返回不带后缀的文件名
}
}
return implode(',', $img_names);
}
在文章列表页或内容页调用
打开你的列表页模板(如 list_article.htm页模板(如 article_article.htm)。
示例:获取文章第一张图片的名称
在需要显示图片名称的地方,插入以下代码:
{dede:field.body function='GetFirstImgName(@me)'/}
代码解释:
{dede:field.body}:获取文章内容。function='...':这是一个函数调用标记。@me:这是一个特殊变量,代表{dede:field.body}标签本身获取到的值(也就是文章内容全文)。GetFirstImgName(@me):将文章内容全文作为参数,传递给我们刚刚在extend.func.php中定义的GetFirstImgName函数。
示例:获取文章所有图片的名称(用逗号分隔)
{dede:field.body function='GetAllImgNames(@me)'/}
直接使用 field 标签调用缩略图名称(仅适用于缩略图)
如果你的需求仅仅是调用文章设置的“缩略图”的文件名,而不是文章内容里的任意图片,那么可以直接使用 litpic 字段。
在列表页调用
在列表页模板(如 list_article.htm)中:
{dede:list}
<li>
<!-- 获取缩略图的完整路径,/uploads/2025/10/01/abc.jpg -->
<img src="[field:litpic/]" alt="[field:title/]">
<!-- 获取缩略图的文件名,abc.jpg -->
<p>缩略图文件名: [field:litpic function='(@me)'/]</p>
<!-- 获取不带后缀的文件名,abc -->
<p>缩略图文件名(无后缀): [field:litpic function='pathinfo(@me)["filename"]'/]</p>
</li>
{/dede:list}
代码解释:
[field:litpic/]:直接调用缩略图的完整路径。[field:litpic function='(@me)'/]:这里function的用法有点特殊,因为litpic已经是字符串了,@me就是这个字符串,这个写法等同于直接输出[field:litpic/]。[field:litpic function='pathinfo(@me)["filename"]'/]:这是调用了PHP内置的pathinfo()函数。pathinfo()会解析一个路径,返回一个包含dirname,basename,extension,filename等信息的数组,我们取其中的filename键值,就可以得到不带后缀的文件名。
页调用
页模板(如 article_article.htm)中,用法和列表页完全一样:
<img src="{dede:field name='litpic'/}" alt="{dede:field.title/}">
<p>缩略图文件名(无后缀): {dede:field name='litpic' function='pathinfo(@me)["filename"]'/}</p>
修改 arclist 标签,增加一个自定义字段(高级用法)
如果你需要在列表页中直接调用文章内容里的第一张图片名称,并且希望像 {field:title} 一样方便地使用,可以修改 arclist.lib.php 文件,增加一个自定义的底层字段。
修改 include/taglib/arclist.lib.php 文件
找到 GetArcList 函数,在 $fields 数组中添加一个新的字段,imgname。
// 在 $fields 数组中添加 'imgname' => "GetFirstImgName(arc.body)", // arc.body 是文章内容字段
在模板中使用
修改后,你就可以在 arclist 标签中直接使用 [field:imgname/] 了。
{dede:arclist titlelen='30' row='5'}
<li>
<!-- 获取第一张图片的文件名 -->
<p>图片名: [field:imgname/]</p>
</li>
{/dede:arclist}
注意: 这种方法需要修改核心文件,升级 DedeCMS 时可能会被覆盖,需要重新修改,除非有特殊需求,否则不推荐普通用户使用。
总结与推荐
| 场景 | 推荐方法 | 优点 | 缺点 |
|---|---|---|---|
| 获取文章内容里的任意图片名称 | extend.func.php + {dede:field.body function} |
最灵活、最强大,不修改核心文件,可扩展性强(如获取所有图片名) | 需要手动创建/修改 extend.func.php 文件 |
| 仅获取缩略图的名称 | {field:litpic} + pathinfo |
简单、直接,无需额外函数 | 只能用于缩略图,无法获取文章内容里的图片 |
| 在列表页频繁调用文章内图片名 | 修改 arclist.lib.php |
模板调用语法最简洁,像调用普通字段一样方便 | 修改核心文件,升级有风险,不适合新手 |
对于绝大多数用户,强烈推荐使用【方法一】,它既安全又灵活,能够满足绝大多数关于图片名称调用的需求。
