织梦body中图片的url

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

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

织梦body中图片的url
(图片来源网络,侵删)

核心思路

直接从 {dede:field.body/} 中获取图片URL是不行的,因为这个标签输出的是包含HTML标签的完整文章内容,我们需要分两步走:

  1. 获取文章内容:使用 {dede:field.body/} 获取原始的HTML文本。
  2. 解析并提取图片URL:使用织梦的内置函数或自定义PHP代码,从HTML文本中提取出所有 <img> 标签的 src 属性值。

使用织梦内置的 GetBody 函数(推荐)

织梦提供了一个非常方便的内置函数 GetBody,它可以专门用来处理文章内容,提取图片、链接等,这是最简单、最推荐的方法。

提取第一张图片作为缩略图

这是最常见的用法,比如在列表页需要显示文章的第一张图作为封面。

使用场景:在列表页(list_article.htm页(article_article.htm)中,循环调用文章。

织梦body中图片的url
(图片来源网络,侵删)

代码示例

{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)中展示文章内的所有图片。

织梦body中图片的url
(图片来源网络,侵删)

代码示例

{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>

代码解析

  1. {dede:field.body runphp='yes'}: runphp='yes' 是关键,它告诉织梦执行其中的PHP代码,并将 @me 初始化为 [field:body] 的值。
  2. preg_match_all(): 这是一个强大的PHP正则表达式函数,用于在字符串中查找所有匹配项。
    • /<img.*?src="(.*?)".*?>/i: 这个正则表达式的意思是:
      • <img: 匹配 <img 开头。
      • 匹配任意字符(除了换行符),非贪婪模式。
      • src=": 匹配 src="
      • 这是一个捕获组,它会匹配 src=" 和 之间的内容,也就是我们想要的URL,这是 $matches[1] 的来源。
      • 匹配 src 属性之后的其他任意属性。
      • >: 匹配 >
      • /i: 表示不区分大小写。
  3. $matches[1]: preg_match_all 的结果是一个二维数组,第一个元素 $matches[0] 是所有匹配到的完整 <img> 标签,而 $matches[1] 则是所有捕获组(也就是所有图片的URL)。
  4. @me = '';: 清空 @me,因为我们要用新的内容来填充它。
  5. foreach ($image_urls as $url): 循环处理每一个URL。
  6. strpos($url, 'http') !== 0: 判断URL是否是绝对路径(以http开头),如果不是,就手动拼接上你的网站域名,确保图片能正确显示。
  7. @me .= ...: 将处理好的HTML代码拼接到 @me 上,整个 {dede:field.body runphp='yes'} 标签就会被替换成这个生成的HTML列表。

总结与对比

方法 优点 缺点 适用场景
GetBody 函数 简单易用,一行代码搞定。
官方支持,稳定可靠。
自动处理路径问题。
灵活性较低,只能提取第一张或全部。
返回的是HTML标签,不是纯URL。
提取文章第一张图作为封面图。
快速展示文章内的所有图片。
自定义PHP代码 灵活性极高,可以任意处理URL。
可以获取纯URL数组,方便后续操作。
可以添加复杂的判断逻辑。
代码稍复杂,需要懂PHP和正则。
如果修改不当,有出错风险。
需要对图片URL进行特殊处理(如域名替换、加水印等)。
需要将图片URL存入数组进行循环展示。
内置函数无法满足的复杂需求。

对于绝大多数情况,强烈推荐使用方法一(GetBody 函数),因为它既简单又高效,只有在需要非常精细控制时,才考虑使用方法二。

-- 展开阅读全文 --
头像
c语言windowsapi函数
« 上一篇 2025-12-29
织梦CMS本地环境安装步骤有哪些?
下一篇 » 2025-12-29

相关文章

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

目录[+]