推荐使用 - 自定义函数 + 自定义标签(最灵活、最推荐)
这是最规范、最灵活的方法,可以在任何需要的地方调用,并且代码复用性高。

第1步:在 include/extend.func.php 文件中添加自定义函数
这个文件是织梦用来存放自定义函数的,修改它不会影响核心文件,非常安全。
- 用FTP或文件管理器打开您的网站根目录。
- 找到并打开
/include/extend.func.php文件。 - 在文件末尾的
?>之前,添加以下PHP代码:
/**
* 获取文章内容中的所有图片
* @param string $body 文章内容
* @param int $num 获取图片的数量,0为获取所有
* @return string 返回图片数组,如 array('imgsrc1', 'imgsrc2', ...)
*/
function GetImages($body, $num = 0) {
// 清除所有样式和脚本标签,防止干扰
$body = preg_replace('/<style[^>]*>.*?<\/style>/is', '', $body);
$body = preg_replace('/<script[^>]*>.*?<\/script>/is', '', $body);
// 匹配所有img标签
preg_match_all('/<img\s[^>]*src=(["\'])([^"\']+)\1[^>]*>/i', $body, $matches);
$img_srcs = $matches[2]; // 获取所有图片地址
// 如果指定了数量,则截取数组
if ($num > 0 && count($img_srcs) > $num) {
$img_srcs = array_slice($img_srcs, 0, $num);
}
return $img_srcs;
}
代码解释:
- 这个函数接收两个参数:
$body)和$num(要获取的图片数量,0表示全部)。 - 使用正则表达式
preg_match_all来查找文章内容中所有<img>标签的src属性值。 - 返回一个包含所有图片地址的数组。
第2步:在模板文件中使用自定义标签
您可以在任何文章列表页(如 arclist.htm)或文章内容页(如 article_article.htm)中调用这个函数了。
示例1:在文章列表页(arclist.htm)中调用

假设您想在文章列表的摘要后面显示该文章的第一张图片。
{dede:arclist row='10' titlelen='50'}
<div class="article-item">
<h3><a href="[field:arcurl/]">[field:title/]</a></h3>
<p class="summary">[field:description function='cn_substr(@me,100)'/]...</p>
<!-- 调用函数,获取第一张图片 -->
[field:id function=GetImages(@me, 1)]
<!-- 因为函数返回的是数组,我们需要取出第一个元素 -->
{dede:getdata name='imgsrcs'}
{if $imgsrcs[0]}
<div class="article-img">
<img src="[field:imgsrcs[0]/]" alt="[field:title/]" />
</div>
{/if}
{/dede:getdata}
<a href="[field:arcurl/]" class="read-more">阅读全文</a>
</div>
{/dede:arclist}
上面的写法稍显复杂,更简洁的写法是使用 runphp(但 runphp 在新版织梦中可能被禁用或有安全风险,如果可用,这是最简洁的):
{dede:arclist row='10' titlelen='50'}
<div class="article-item">
<h3><a href="[field:arcurl/]">[field:title/]</a></h3>
<p class="summary">[field:description function='cn_substr(@me,100)'/]...</p>
<!-- 使用runphp直接执行PHP代码 -->
[field:id runphp='yes']
$aid = @me;
$row = $GLOBALS['dsql']->GetOne("SELECT body FROM `#@__addonarticle` WHERE aid = $aid");
// 如果是普通文章,表是 #@__archives,字段是 body
// 如果是普通文章,应该用:
// $row = $GLOBALS['dsql']->GetOne("SELECT body FROM `#@__archives` WHERE id = $aid");
// 这里假设是普通文章模型
$body = $row['body'];
$img_srcs = GetImages($body, 1);
@me = $img_srcs[0] ? "<div class='article-img'><img src='".$img_srcs[0]."' alt='".htmlspecialchars($row['title'])."' /></div>" : "";
[/field:id]
<a href="[field:arcurl/]" class="read-more">阅读全文</a>
</div>
{/dede:arclist}
注意:runphp 方法需要明确文章内容存储在哪个表(#@__archives 还是 #@__addonarticle),并且对服务器安全配置有要求。
示例2:在文章内容页(article_article.htm)中调用
页,文章内容已经由 [field:body/] 标签解析好了,我们可以直接在页面其他位置调用。
假设想在文章内容下方,展示一个该文章所有图片的缩略图列表。
<!DOCTYPE html>
<html>
<head>[field:title/]</title>
</head>
<body>
<h1>[field:title/]</h1>
<div class="content">
[field:body/]
</div>
<!-- 在这里调用函数,获取所有图片 -->
{dede:getdata name='all_images'}
[field:id function=GetImages(@me, 0)]
{if $all_images}
<div class="gallery">
<h3>文章图片</h3>
<ul>
{dede:list}
<li>
<a href="[field:global.cfg_cmsurl/]/[field:src/]" data-lightbox="gallery">
<img src="[field:src/]" alt="[field:global.autoindex/]" />
</a>
</li>
{/dede:list}
</ul>
</div>
{/if}
{/dede:getdata}
</body>
</html>
上面的写法在织梦标签嵌套上可能会出错,更稳妥的方式是使用 runphp:
<!DOCTYPE html>
<html>
<head>[field:title/]</title>
</head>
<body>
<h1>[field:title/]</h1>
<div class="content">
[field:body/]
</div>
<!-- 使用runphp获取文章ID并调用函数 -->
[field:id runphp='yes']
$aid = @me;
// 从主表获取文章内容
$row = $GLOBALS['dsql']->GetOne("SELECT body FROM `#@__archives` WHERE id = $aid");
$body = $row['body'];
// 调用我们之前写的函数
$all_images = GetImages($body, 0); // 获取所有图片
// 如果有图片,则生成HTML
if ($all_images) {
$html = '<div class="gallery"><h3>文章图片</h3><ul>';
foreach ($all_images as $img_src) {
// 为了安全,给图片路径加上网站根目录
$full_img_src = $GLOBALS['cfg_basehost'] . $img_src;
$html .= "<li><a href='{$full_img_src}' data-lightbox='gallery'><img src='{$full_img_src}' alt='' /></a></li>";
}
$html .= '</ul></div>';
@me = $html;
} else {
@me = ''; // 如果没有图片,则不显示任何内容
}
[/field:id]
</body>
</html>
使用正则表达式直接在模板中提取(不推荐,仅作了解)
这种方法不修改任何文件,直接在模板里写PHP代码,简单粗暴,但可读性和维护性差,且依赖 runphp 功能。
{dede:arclist row='5'}
<div>
<h2>[field:title/]</h2>
[field:id runphp='yes']
$aid = @me;
$row = $GLOBALS['dsql']->GetOne("SELECT body FROM `#@__archives` WHERE id = $aid");
$body = $row['body'];
// 一行搞定,直接匹配并输出第一张图
preg_match('/<img\s+.*?src=["|\']?(.+?)["|\']?\s+.*?>/i', $body, $img);
@me = $img[1] ? "<img src='".$img[1]."' width='200' />" : "";
[/field:id]
</div>
{/dede:arclist}
缺点:
- 代码臃肿,难以阅读。
- 如果需要修改逻辑(比如获取3张图),就得修改这段复杂的代码。
- 和方法一中的
runphp示例一样,存在安全风险和依赖性问题。
修改织梦源码(非常不推荐,仅适用于高级用户)
这种方法通过修改织梦的核心文件,为 arclist 或 list 标签增加一个新功能,imgsrc 或 imgnum,这能实现像 [field:title/] 一样直接调用。
警告: 修改核心文件在织梦升级时会被覆盖,导致功能失效,且容易引发未知错误,强烈不推荐普通用户使用。
如果非要实现,大致步骤如下:
- 修改
/include/taglib/arclist.lib.php文件。 - 在SQL查询中增加对
body字段的获取(SELECT body, ...)。 - 在循环处理数据的部分,增加对
body内容的解析,提取图片地址。 - 将提取到的图片地址存入一个数组,并传递给模板。
- 在模板中就可以使用
[field:imgsrc/]这样的新标签了。
由于此方法过于复杂且风险高,这里不提供具体代码。
总结与建议
| 方法 | 优点 | 缺点 | 推荐度 |
|---|---|---|---|
| 自定义函数 | 灵活、规范、可复用、安全 | 需要修改 extend.func.php 文件,并理解 runphp 或嵌套标签 |
★★★★★ (最推荐) |
| 模板正则 | 无需修改文件,快速实现 | 代码可读性差,难以维护,依赖 runphp |
★★☆☆☆ (不推荐) |
| 修改源码 | 功能集成度高,调用最方便 | 破坏核心文件,升级后失效,风险极高 | ☆☆☆☆☆ (强烈不推荐) |
对于绝大多数用户,请使用【方法一:自定义函数】,它虽然需要你稍微动手修改一下 extend.func.php,但这是最专业、最稳定、最易于扩展的解决方案,一旦函数写好,你就可以在网站的任何地方轻松调用。
