有点不好描述,算个小白吧,只会描述问题,AI 给我什么代码我就用什么代码,只能看出一些简单的问题。
我有个论坛程序是很古老的 phpwind7.5 还是 GBK 的。
首页有个首页多栏会拉取新主题,但是一直不知道什么问题,经常会因为一些主题里包含某些字符或者繁体,导致有些标题代码结构改变,就会变成下图这样:
https://imgur.com/PU1K2P8我也不知道是编码的问题还是截取字符导致标签断了的问题。
我本来是这样(部分代码)-------------------------------------------------------------------
// --- [核心修复 4]:组装输出 ---
global $db_config;
$subject_max_len = isset($db_config['subjectmaxlen']) ? intval($db_config['subjectmaxlen']) : 45;
// 使用 stripslashes 后的 subject 进行安全截断
$truncated_subject = Char_cv($subject);
$truncated_subject = substrs($truncated_subject, $subject_max_len);
// 组装最终 HTML
$post['title'] = $tag_html . '<h1' . $h1_class . ' title="' . $final_tooltip . '">' . $truncated_subject . '</h1>';
最后 DS 给我改成这样就没问题了----------------------------------------------------------------
// ============ [输出组装] ============
global $db_config;
$subject_max_len = isset($db_config['subjectmaxlen']) ? intval($db_config['subjectmaxlen']) : 40;
$truncated_subject = Char_cv($rt['subject']);
if (mb_strlen($truncated_subject, 'GBK') > $subject_max_len) {
// 安全截断:确保不会在中文标点中间截断
$truncated = mb_substr($truncated_subject, 0, $subject_max_len, 'GBK');
// 检查最后一个字符是否是开标点,如果是则回退
$last_char = mb_substr($truncated, -1, 1, 'GBK');
$open_punctuations = array(' [', '《', '(', '(', '[', '{', '<');
if (in_array($last_char, $open_punctuations)) {
// 回退一个字符,避免破坏标点对
$truncated = mb_substr($truncated, 0, -1, 'GBK');
}
$truncated_subject = $truncated . '...';
}
// 对标题文本进行 HTML 实体编码,防止特殊字符破坏 HTML 结构
$safe_subject = htmlspecialchars($truncated_subject, ENT_QUOTES, 'GBK');
$safe_final_title = htmlspecialchars($final_title, ENT_QUOTES, 'GBK');
// 构建完整的 HTML 输出
$post['title'] = $tag_html . '<h1' . $h1_class . ' title="' . $safe_final_title . '">' . $safe_subject . '</h1>';
----------------------------------------------------------------------------------------
关键是我就简单引导了几句,2 轮对话就搞定了。
反而 gemini3pro 我跟他讲的再清楚都解决不了,然后讲久了他就慢慢有点像记忆力不好的老人开始胡言乱语了。
其实这个问题我是从 gemini2pro 问到 3 的,每次我都质疑自己是我自己没讲清楚,所以每次头脑清醒的时候我都会再试一次,结果每次都把自己弄的一头雾水。
没想到一直被我遗弃的的 deepseek 解决了我这问题。