织梦如何提取第一张图片?

99ANYc3cd6
预计阅读时长 15 分钟
位置: 首页 织梦建站 正文

使用织梦自带的 GetFirstImg 函数(最推荐)

这是织梦官方内置的函数,专门用于这个目的,使用起来最简单、最稳定。

织梦提取第一张图片
(图片来源网络,侵删)

函数说明

GetFirstImg($body):接收文章正文内容($body)作为参数,返回第一张图片的完整 <img>

使用场景

通常在文章列表模板(list_article.htm)或文章内容页模板(article_article.htm)中使用。

使用示例

场景:在文章列表页显示每篇文章的第一张图作为缩略图

打开你的列表模板文件 list_article.htm,找到循环文章内容的地方(通常是 [field:body/] 或类似标签所在的位置),用以下代码替换:

{dede:list pagesize='10'}
    <li>
        <!-- 获取第一张图片并显示 -->
        [field:body function='GetFirstImg(@me)'/]
        <!-- 如果需要只显示图片地址,而不是整个img标签,可以这样做 -->
        <!-- [field:body function='preg_replace('/.*?src="(.*?)".*?/i', '\\1', GetFirstImg(@me))'/] -->
        <a href="[field:arcurl/]">[field:title/]</a>
        <p>[field:description function='cn_substr(@me, 100)'/]...</p>
    </li>
{/dede:list}

代码解释:

织梦提取第一张图片
(图片来源网络,侵删)
  • [field:body function='GetFirstImg(@me)'/]:这是核心用法。
    • @me:代表当前字段的原始值,在这里就是文章的 body 字段内容。
    • function='GetFirstImg()':调用 GetFirstImg 函数,并将 @me(即文章正文)作为参数传递进去。
    • 函数会返回类似 <img src='/uploads/2025/10/01/1.jpg' alt='' width='100' height='100' /> 这样的完整HTML标签。

场景:在文章内容页获取第一张图

article_article.htm 模板中,如果你想获取正文第一张图,可以这样用:

<!-- 在文章内容上方或任意位置显示第一张图 -->
{dede:field.body function='GetFirstImg(@me)'/}
<!-- 文章正文内容 -->
{dede:field.body/}

使用自定义函数(更灵活)

如果你觉得 GetFirstImg 函数不够用(比如你想自定义默认图片、获取图片地址但不带 <img> 标签等),你可以自己写一个函数。

步骤:创建自定义函数

  1. 找到并打开 include/helpers/extend.helper.php 文件,这个文件是专门用来存放自定义扩展函数的。
  2. 在文件末尾的 ?> 之前,添加你自己的函数代码。

示例函数代码:

织梦提取第一张图片
(图片来源网络,侵删)
/**
 * 获取文章正文中的第一张图片地址
 * @param string $body 文章内容
 * @param string $default 默认图片地址(如果找不到图片则返回此)
 * @return string 图片地址
 */
function GetFirstImgUrl($body, $default = '/images/default.jpg')
{
    // 如果body为空,直接返回默认图
    if (empty($body)) {
        return $default;
    }
    // 匹配 <img> 标签的正则表达式
    // 匹配 src 属性,并捕获其值
    $pattern = "/<img\s[^>]*?src=['\"](.*?)['\"][^>]*?>/i";
    if (preg_match($pattern, $body, $matches)) {
        // 如果找到匹配,返回第一个捕获组(即图片地址)
        return $matches[1];
    } else {
        // 如果没找到图片,返回默认图
        return $default;
    }
}

在模板中使用

现在你可以在任何模板中调用这个新函数了。

示例:在列表模板中使用

{dede:list pagesize='10'}
    <li>
        <!-- 调用自定义函数,并传入默认图片地址 -->
        <img src="[field:body function='GetFirstImgUrl(@me, "/images/no_pic.jpg")'/]" alt="[field:title/]" />
        <a href="[field:arcurl/]">[field:title/]</a>
    </li>
{/dede:list}

代码解释:

  • GetFirstImgUrl(@me, "/images/no_pic.jpg"):调用我们刚刚创建的函数。
  • @me:依然是文章正文。
  • "/images/no_pic.jpg":作为第二个参数传入,是找不到图片时显示的默认图片地址。

直接使用正则表达式(不推荐,但了解无妨)

这种方法最直接,但不够灵活,且如果织梦官方更新了函数逻辑,可能会产生冲突。仅作了解,不建议在生产环境中使用

在模板文件中使用 preg_replace 来直接提取。

{dede:list pagesize='10'}
    <li>
        <!-- 使用正则表达式直接替换,只保留第一张图片的src -->
        [field:body function='preg_replace("/.*?<img\s[^>]*?src=[\'|\"](.*?)[\'|\"].*?>/i", "\\1", @me)'/]
        <!-- 如果想得到整个img标签,可以这样写 -->
        <!-- [field:body function='preg_replace("/^.*?<img\s[^>]*?src=[\'|\"](.*?)[\'|\"].*?>.*$/i", "<img src=\"\\1\" />", @me)'/] -->
        <a href="[field:arcurl/]">[field:title/]</a>
    </li>
{/dede:list}

缺点:

  • 代码复杂,不易读。
  • 功能单一,比如很难加入默认图片的逻辑。
  • 织梦官方可能会修改 GetFirstImg 的实现,导致你的正则表达式失效。

总结与推荐

方法 优点 缺点 推荐度
GetFirstImg 函数 官方内置,稳定可靠,使用简单 功能相对固定,自定义能力稍弱 ⭐⭐⭐⭐⭐ (首选)
自定义函数 灵活强大,可自定义默认图、返回格式等 需要手动修改文件,对新手稍复杂 ⭐⭐⭐⭐ (进阶首选)
正则表达式 直接,不依赖函数 代码复杂,不易维护,不推荐 ⭐ (仅作了解)

最终建议:

  • 对于绝大多数用户,直接使用 方法一 就完全足够了,这是最标准、最安全的方式。
  • 如果你有特殊需求,比如必须要有默认图片,或者只需要图片地址,方法二 是你的最佳选择。
-- 展开阅读全文 --
头像
Fuchsia C语言如何适配其微内核架构?
« 上一篇 04-13
inTouch C语言是什么?入门还是进阶?
下一篇 » 04-13

相关文章

取消
微信二维码
支付宝二维码