这是一个非常常见的需求,因为文章内容中的图片可能需要被单独提取出来,用于制作缩略图、图集展示或者进行其他处理。

(图片来源网络,侵删)
核心思路
直接从 {dede:field.body/} 中获取图片URL是不行的,因为这个标签输出的是包含HTML标签的完整文章内容,我们需要分两步走:
- 获取文章内容:使用
{dede:field.body/}获取原始的HTML文本。 - 解析并提取图片URL:使用织梦的内置函数或自定义PHP代码,从HTML文本中提取出所有
<img>标签的src属性值。
使用织梦内置的 GetBody 函数(推荐)
织梦提供了一个非常方便的内置函数 GetBody,它可以专门用来处理文章内容,提取图片、链接等,这是最简单、最推荐的方法。
提取第一张图片作为缩略图
这是最常见的用法,比如在列表页需要显示文章的第一张图作为封面。
使用场景:在列表页(list_article.htm页(article_article.htm)中,循环调用文章。

(图片来源网络,侵删)
代码示例:
{dede:arclist titlelen='30' row='10'}
<div class="article-item">
<!--
GetBody函数会自动提取文章body中的第一张图片,
并将其格式化为一个完整的、可访问的URL。
如果文章没有图片,则返回空字符串。
-->
[field:body function='GetBody(@me, 1)'/]
<!-- 使用提取到的图片 -->
<a href="[field:arcurl/]">
<img src="[field:body function='GetBody(@me, 1)'/]" alt="[field:title/]" />
</a>
<h2><a href="[field:arcurl/]">[field:title/]</a></h2>
<p>[field:info/]...</p>
</div>
{/dede:arclist}
代码解析:
{dede:arilogy}: 循环输出文章列表。[field:body function='GetBody(@me, 1)'/]: 这是核心代码。function='GetBody()': 调用织梦的GetBody函数。@me: 这是织梦模板机制中的一个特殊变量,代表当前字段的原始值,在这里就是[field:body]的完整内容。1: 这是传递给GetBody函数的第二个参数,表示“只提取第一张图片”。
提取文章中的所有图片URL
如果你想获取文章中所有图片的URL,并将其用于制作图集或幻灯片,可以这样做。
使用场景页(article_article.htm)中展示文章内的所有图片。

(图片来源网络,侵删)
代码示例:
{dede:field.body function='GetBody(@me, 0)'/}
代码解析:
[field:body function='GetBody(@me, 0)'/]function='GetBody()': 同样调用GetBody函数。@me: 传递[field:body]的原始内容。0: 这个参数表示“提取所有图片”。
输出结果:这段代码会输出一个由 <img> 标签组成的字符串,所有图片的 src 属性都是完整的URL。
<img src='/uploads/202510/image-1.jpg' ... /> <img src='/uploads/202510/image-2.png' ... /> <img src='/uploads/202510/image-3.gif' ... />
如果你想要的是一个纯粹的URL数组,而不是HTML标签,那么就需要使用方法二。
使用自定义PHP代码(更灵活)
当内置函数无法满足你的特殊需求时(你需要一个干净的URL数组),你可以在模板文件中直接嵌入PHP代码。
使用场景:需要在内容页(article_article.htm)中获取图片URL数组,并进行循环展示。
代码示例:
{dede:field.body runphp='yes'}
$body = @me;
// 使用正则表达式匹配所有img标签的src属性
preg_match_all('/<img.*?src="(.*?)".*?>/i', $body, $matches);
// @me 需要被重新赋值
// $matches[1] 就是一个包含所有图片URL的数组
$image_urls = $matches[1];
// 清空 @me,因为我们将在下面使用新的逻辑
@me = '';
// 循环输出图片列表
if (!empty($image_urls)) {
foreach ($image_urls as $url) {
// 确保URL是完整的,如果是相对路径,则补上网站根目录
if (strpos($url, 'http') !== 0) {
$url = 'https://www.yourdomain.com' . $url; // 替换成你的域名
}
@me .= "<li><img src='{$url}' /></li>";
}
} else {
@me = '<li>暂无图片</li>';
}
{/dede:field.body}
<ul>
[field:body/]
</ul>
代码解析:
{dede:field.body runphp='yes'}:runphp='yes'是关键,它告诉织梦执行其中的PHP代码,并将@me初始化为[field:body]的值。preg_match_all(): 这是一个强大的PHP正则表达式函数,用于在字符串中查找所有匹配项。/<img.*?src="(.*?)".*?>/i: 这个正则表达式的意思是:<img: 匹配<img开头。- 匹配任意字符(除了换行符),非贪婪模式。
src=": 匹配src="。- 这是一个捕获组,它会匹配
src="和 之间的内容,也就是我们想要的URL,这是$matches[1]的来源。 - 匹配
src属性之后的其他任意属性。 >: 匹配>。/i: 表示不区分大小写。
$matches[1]:preg_match_all的结果是一个二维数组,第一个元素$matches[0]是所有匹配到的完整<img>标签,而$matches[1]则是所有捕获组(也就是所有图片的URL)。@me = '';: 清空@me,因为我们要用新的内容来填充它。foreach ($image_urls as $url): 循环处理每一个URL。strpos($url, 'http') !== 0: 判断URL是否是绝对路径(以http开头),如果不是,就手动拼接上你的网站域名,确保图片能正确显示。@me .= ...: 将处理好的HTML代码拼接到@me上,整个{dede:field.body runphp='yes'}标签就会被替换成这个生成的HTML列表。
总结与对比
| 方法 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
GetBody 函数 |
简单易用,一行代码搞定。 官方支持,稳定可靠。 自动处理路径问题。 |
灵活性较低,只能提取第一张或全部。 返回的是HTML标签,不是纯URL。 |
提取文章第一张图作为封面图。 快速展示文章内的所有图片。 |
| 自定义PHP代码 | 灵活性极高,可以任意处理URL。 可以获取纯URL数组,方便后续操作。 可以添加复杂的判断逻辑。 |
代码稍复杂,需要懂PHP和正则。 如果修改不当,有出错风险。 |
需要对图片URL进行特殊处理(如域名替换、加水印等)。 需要将图片URL存入数组进行循环展示。 内置函数无法满足的复杂需求。 |
对于绝大多数情况,强烈推荐使用方法一(GetBody 函数),因为它既简单又高效,只有在需要非常精细控制时,才考虑使用方法二。
