发表于 2024/7/11 08:22:38
这是DZ原生代码,提供列表页获取图片和摘要的代码;想要大佬,这里获取的是循环多图,那么如何增加一个只要获取一张图并支持获取外链图片;

[CSS] 纯文本查看 复制代码
function get_attach($list, $video = false, $audio = false){ global $_G; require_once libfile('function/post'); require_once libfile('function/discuzcode'); $tids = $threads = $attachtableid_array = $threadlist_data = $posttableids = array(); foreach($list as $value) { $tids[] = $value['tid']; if(!in_array($value['posttableid'], $posttableids)){ $posttableids[] = $value['posttableid']; } $threads[$value['tid']] = $value; } foreach ($posttableids as $id) { $posts = C::t('forum_post')->fetch_all_by_tid($id, $tids, true, '', 0, 0, 1, null, null, null); foreach($posts as $value) { if(!$_G['forum']['ismoderator'] && $value['status'] & 1) { $threadlist_data[$value['tid']]['message'] = lang('forum/template', 'message_single_banned'); } elseif(strpos($value['message'], '[/password]') !== FALSE) { $threadlist_data[$value['tid']]['message'] = lang('forum/template', 'message_password_exists'); } elseif($threads[$value['tid']]['readperm'] > 0) { $value['message'] = ''; } else { if($threads[$value['tid']]['price'] > 0) { preg_match_all("/\[free\](.+?)\[\/free\]/is", $value['message'], $matches); $value['message'] = ''; if(!empty($matches[1])) { foreach($matches[1] as $match) { $value['message'] .= $match.' '; } } } if($value['message'] && ($video || $audio)){ $value['media'] = ''; $value['message'] = preg_replace(array("/\[hide=?\d*\](.*?)\[\/hide\]/is"), array(""), $value['message']); $value['msglower'] = strtolower($value['message']); if(strpos($value['msglower'], '[/media]') !== FALSE && $video) { preg_match("/\[media=([\w,]+)\]\s*([^\[\<\r\n]+?)\s*\[\/media\]/is", $value['message'], $value['video']); $threadlist_data[$value['tid']]['media'] = parsemedia($value['video'][1], $value['video'][2]); }elseif(strpos($value['msglower'], '[/audio]') !== FALSE && $audio) { preg_match("/\[audio(=1)*\]\s*([^\[\<\r\n]+?)\s*\[\/audio\]/is", $value['message'], $value['audio']); $threadlist_data[$value['tid']]['media'] = parseaudio($value['audio'][2], 400); } } $threadlist_data[$value['tid']]['message'] = messagecutstr($value['message'], 90); if($threads[$value['tid']]['attachment'] == 2) { $attachtableid_array[getattachtableid($value['tid'])][] = $value['pid']; } } } } foreach($attachtableid_array as $tableid => $pids) { $attachs = C::t('forum_attachment_n')->fetch_all_by_pid_width($tableid, $pids, $attachment, 0); foreach($attachs as $value){ $threadlist_data[$value['tid']]['attachment'][] = getforumimg($value['aid'], 0); } } return $threadlist_data; }
发表于 2024/7/11 09:46:24
要修改提供的 Discuz! 代码(get_attach 函数),以便每个主题只获取一张图片,并支持获取外链图片,你可以进行以下调整:

修改附件的 foreach 循环:
不再针对每个主题($attachtableid_array)遍历所有附件,而是修改为仅获取第一个附件(使用 LIMIT 1)。这假设你希望每个主题仅获取一张附件。

支持外链图片:
添加逻辑来检查外链图片,除了论坛附件外,外链图片通常直接链接在帖子消息中。

下面是修改后的代码示例:

[PHP] 纯文本查看 复制代码
function get_attach($list, $video = false, $audio = false){ global $_G; require_once libfile('function/post'); require_once libfile('function/discuzcode'); $tids = $threads = $attachtableid_array = $threadlist_data = $posttableids = array(); foreach($list as $value) { $tids[] = $value['tid']; if(!in_array($value['posttableid'], $posttableids)){ $posttableids[] = $value['posttableid']; } $threads[$value['tid']] = $value; } foreach ($posttableids as $id) { $posts = C::t('forum_post')->fetch_all_by_tid($id, $tids, true, '', 0, 0, 1, null, null, null); foreach($posts as $value) { if(!$_G['forum']['ismoderator'] && $value['status'] & 1) { $threadlist_data[$value['tid']]['message'] = lang('forum/template', 'message_single_banned'); } elseif(strpos($value['message'], '[/password]') !== FALSE) { $threadlist_data[$value['tid']]['message'] = lang('forum/template', 'message_password_exists'); } elseif($threads[$value['tid']]['readperm'] > 0) { $value['message'] = ''; } else { if($threads[$value['tid']]['price'] > 0) { preg_match_all("/\[free\](.+?)\[\/free\]/is", $value['message'], $matches); $value['message'] = ''; if(!empty($matches[1])) { foreach($matches[1] as $match) { $value['message'] .= $match.' '; } } } // 检查视频和音频嵌入 if($value['message'] && ($video || $audio)){ $value['media'] = ''; $value['message'] = preg_replace(array("/\[hide=?\d*\](.*?)\[\/hide\]/is"), array(""), $value['message']); $value['msglower'] = strtolower($value['message']); if(strpos($value['msglower'], '[/media]') !== FALSE && $video) { preg_match("/\[media=([\w,]+)\]\s*([^\[\<\r\n]+?)\s*\[\/media\]/is", $value['message'], $value['video']); $threadlist_data[$value['tid']]['media'] = parsemedia($value['video'][1], $value['video'][2]); } elseif(strpos($value['msglower'], '[/audio]') !== FALSE && $audio) { preg_match("/\[audio(=1)*\]\s*([^\[\<\r\n]+?)\s*\[\/audio\]/is", $value['message'], $value['audio']); $threadlist_data[$value['tid']]['media'] = parseaudio($value['audio'][2], 400); } } // 截取并存储消息摘要 $threadlist_data[$value['tid']]['message'] = messagecutstr($value['message'], 90); // 获取附件 if($threads[$value['tid']]['attachment'] == 2) { $attachtableid_array[getattachtableid($value['tid'])][] = $value['pid']; } // 如果启用外链图片,则添加逻辑 if($threads[$value['tid']]['attachment'] == 2) { $attachs = C::t('forum_attachment_n')->fetch_all_by_pid_width($tableid, $pids, $attachment, 0, 1); // 每个主题仅获取一个附件 foreach($attachs as $value){ $threadlist_data[$value['tid']]['attachment'][] = getforumimg($value['aid'], 0); } } elseif($external_images_enabled) { preg_match_all('/<img.+?src=[\'"]([^\'"]+)[\'"].*?>/i', $value['message'], $matches); if(!empty($matches[1])) { // 假设你希望获取帖子中找到的第一个图片 $threadlist_data[$value['tid']]['attachment'][] = $matches[1][0]; } } } } } return $threadlist_data; } 



解释:
  • 附件获取:fetch_all_by_pid_width 函数现在包括了限制 (0, 1),以便每个主题仅获取一个附件。
  • 外链图片:添加了一个检查 ($external_images_enabled) 来从帖子消息中获取外链图片。这使用正则表达式来查找 <img> 标签并提取 src 属性。
根据你的设置或偏好调整 $external_images_enabled,这些修改确保你每个主题仅获取一个附件,并且能够支持在论坛附件之外获取外链图片。

发表于 2024/7/11 09:47:08
GPT解答的,不一定准确噢
发表于 2024/7/11 17:07:30
9527 发表于 2024/7/11 09:47
GPT解答的,不一定准确噢

用不了,估计有很多逻辑上错误
发表于 2024/7/11 17:08:33
9527 发表于 2024/7/11 09:47
GPT解答的,不一定准确噢

以前不是有那个图片模式支持外链的修改方法,就是现在搜索不到修改教程了,不然可以参考一下!
发表于 2024/7/12 08:21:39
还是第一次 发表于 2024/7/11 17:08
以前不是有那个图片模式支持外链的修改方法,就是现在搜索不到修改教程了,不然可以参考一下! ...

可以尝试从内容中提取[img]标签,也就是外链的图片标签
我刚测试了下可以实现:https://cn.admxn.com/home.php?mo ... w=me&from=space
发表于 2024/7/12 17:51:40
9527 发表于 2024/7/12 08:21
可以尝试从内容中提取[img]标签,也就是外链的图片标签
我刚测试了下可以实现:https://cn.admxn.com/hom ...

[CSS] 纯文本查看 复制代码
foreach($attachtableid_array as $tableid => $pids) { $attachs = C::t('forum_attachment_n')->fetch_all_by_pid_width($tableid, $pids, $attachment, 0); foreach($attachs as $value){ // 直接获取图片地址并存储在 $threadlist_data 数组中的 attachment 键下 $threadlist_data[$value['tid']]['attachment'][] = $value['attachment']; } } return $threadlist_data;


我将获取缩量图直接改成直接获取图片地址,$threadlist_data[$value['tid']]['attachment'][] = $value['attachment'];;

但是获取到的是202406/07/191611awurbuvuokndtczo.png;找了很多代码来看,都没有相关补全的案例,需要加什么?才可以补全
发表于 2024/7/12 19:38:46
9527 发表于 2024/7/12 08:21
可以尝试从内容中提取[img]标签,也就是外链的图片标签
我刚测试了下可以实现:https://cn.admxn.com/hom ...

[CSS] 纯文本查看 复制代码
if(empty($threadlist_data[$value['tid']]['attachment'])) { preg_match_all("/\[img\]\s*([^\[\<\r\n]+?)\s*\[\/img\]/is", $value['message'], $img_matches); if(!empty($img_matches[1])) { $threadlist_data[$value['tid']]['attachment'] = $img_matches[1]; } }


另外,我这个从内容中提取[img]标签,好像有问题