修正PHPBB3中文版首页最新文章标题长度及字数问题

phpBB 3.1.X 相关的使用、安装等话题
版面规则
《发帖时,请复制下列格式文本,提供完整的信息,勿简略发布》


###### 以下为“基本的提问格式” ######
  • 主机操作系统: Windows (XP, 7, 8, 10)、Linux(Redhat,Centos, Mandrake等等)、或者其他的(请务必注明版本)
  • 快速架站程序: AppServ、XAMPP 等等(请务必注明版本号)
  • 您的上网方式:ADSL、Cable、FTTB等等 (请务必留下 ISP 名称或 ISP 官网)
  • 您安装的程序: Apache + php + MySQL 或者其他的组合 (请务必留下版本号,如果使用上面的快速架站程序就不必写了)
  • 您的 phpBB 版本: phpBB 3.1.8
  • 您的域名: 比如 phpbbchinese.com
  • 您的 phpBB 网址: 比如 https://www.phpbbchinese.com/
###### 以上为“基本的提问格式” ######

  • 安装扩展: 请注明安装扩展的名称,版本以及参考链接(非扩展问题免填)
  • 安装风格: 请注明安装的风格名称,版本以及参考链接(非风格问题免填)
  • 错误代码: 请使用 Code 标签将错误代码标识出来,如下:

代码: 全选

错误代码
  • 错误状态:如果没有错误代码,请直接贴出截图,或者是详细叙述错误状态内容。
备注:
如果需要,请提供测试用的账号与密码
若是管理账号,请使用短信联系站长
回复
lbren
注册用户
注册用户
Rank 3
Rank 3
帖子: 18
注册时间: 2016年6月1日 15:17

修正PHPBB3中文版首页最新文章标题长度及字数问题

帖子 lbren » 2016年6月5日 22:06

这是一个网友向我提出的关于PHPBB 3问题
我也使用phpbb 3,但我发现在首页论坛列表处的最新文章处的标题字数显示不正常。如果不截断,是没有什么问题的,一旦截断标题字符,那么英文和中文字数相同的情况下,英文标题要比中文标题短很多,在中英文混杂的情况下,最新文章这儿显得长短不一,影响美观...
我在此也把我的解决方法和大家共同分享一下,供大家参考。
这个问题涉及到了PHP对多字节字符处理的问题。PHPBB3的字符截取函数定义在 includes/functions_content.php里面,函数名为truncate_string,它的功能是截取字符,对多字节字符(比如说中文字符),无论是几字节的,都以一个字符为长度。但同样长度的中、英文字符的长度是不一致的,因此会造成视觉上的长短不一。
核心数据论坛对此函数进行了改动。这里使用了一个非标准PHP库的函数mb_strimwidth,使用它之前要确保PHP加载了mbstring库。改写后的truncate_string将先以单字节来判断标题文字是否超过设置长度,如字数超出设置,就调用mb_strimwidth函数进行截取。因为处理前是以单个字符长度来检测的,中英文字符都以最小单位char来计数的,所以固定长度的char其长度是完全一致的。改后的truncate_string如下:

代码: 全选

function truncate_string($string, $max_length = 60, $max_store_length = 255, $allow_reply = false, $append = '')
{
   $strip_reply = false;
   $stripped = false;
   if ($allow_reply && strpos($string, 'Re: ') === 0)
   {
      $strip_reply = true;
      $string = substr($string, 4);
   }
   if (strlen($string) > $max_length)
   {
      $string = mb_strimwidth($string,0,$max_length-utf8_strlen($append),$append,'UTF-8');
      $stripped = false;
   }

   // Due to specialchars, we may not be able to store the string...
   if (utf8_strlen($string) > $max_store_length)
   {
      // let's split again, we do not want half-baked strings where entities are split
      $_chars = utf8_str_split(htmlspecialchars_decode($string));
      $chars = array_map('utf8_htmlspecialchars', $_chars);

      do
      {
         array_pop($chars);
         $string = implode('', $chars);
      }
      while (!empty($chars) && utf8_strlen($string) > $max_store_length);
   }

   if ($strip_reply)
   {
      $string = 'Re: ' . $string;
   }

   if ($append != '' && $stripped)
   {
      $string = $string . $append;
   }

   return $string;
}

确认您的空间支持mbstring后,即可用以上代码替换掉includes/functions_content.php中function truncate_string的内容。
显示的标题最大字符数需要在 includes/functions_display.php中查找

代码: 全选

$last_post_subject_truncated = truncate_string($last_post_subject, 30, 255, false, $user->lang['ELLIPSIS']);
修改truncate_string( 后边第一个数字参数30的大小即可。



回复