【问题标题】:Truncate a multibyte string to approximately n words with PHP mb functions使用 PHP mb 函数将多字节字符串截断为大约 n 个单词
【发布时间】:2014-09-08 17:04:38
【问题描述】:

在 SO 上询问 this 问题后,我需要准备一个自定义 PHP 函数来获取我的字符串的简短版本,因为我在网络上找不到直接的答案/代码。

要求是:

  1. 知道multibyte language 中的şığ 等字符编码在 UTF-8
  2. 能够确定允许的长度(通过使用字符数)
  3. 取长字符串的一部分后,末尾的单词 字符串必须是有意义的,并且将 '...' 连接到末尾 部分
  4. 必须考虑击键(字符),而不是字节

读者应该知道代码有效,但我不是专家。我相信通过更有效或更深入思考的编码可以实现相同的目标。 如您所见,代码没有安全问题,它只会在输入字符串超过允许的长度时对其进行操作。

问候

【问题讨论】:

    标签: php string multibyte multibyte-functions


    【解决方案1】:
    // PrintBrief   : Only introduction words (brief) are printed, multibyte safe
    //                IMPORTANT: assumed that no tag has been used in input string
    //                output's last word be a meaningful word, no need to worry about erroneous multibyte slicing
    // $str         : string    input string to be written briefly
    // $max_chars   : number    if string is longer than $max_chars, only first $max_chars will be the source string
    // $encoding    : string    multibyte encoding
    function PrintBrief ($str , $max_chars = ALLOWED_NUM_OF_CHARS, $encoding = "UTF-8")
    {
        mb_regex_encoding($encoding);
        mb_internal_encoding($encoding);
        if ( mb_strlen($str , $encoding) > $max_chars )
        {
            $str = mb_substr($str , 0 , $max_chars , $encoding);
            $w = array();
            $w = mb_split(' ',$str);
            $k = array_pop($w);
            $k = trim(implode(' ', $w));
            $punc = array(';' , ',');
            for ( $i = 1 ; $i <= count($punc) ; $i++ )
            { $k = rtrim($k , $punc[$i] ); }
            return $k.' ...';
    
        }
        else
        {
            return $str;
    
        }
    }
    

    示例用法:

    $str = 'şğıöç İĞŞ ĞŞĞŞ Öİ ÇÇ Orta Amerika\'nın en büyük ülkesi Nikaragua\'nın başkenti Managua dün sabaha karşı büyük bir patlamayla sarsıldı. Olayın, şehre düşen ufak bir meteroit sonucu açılan krater çukurundan kaynaklandığı anlaşıldı. 1 milyon 200 bin kişinin yaşadığı ve bünyesinde ulsulararası bir havalimanının da olduğu şehre meteorit düşmesi sonucu, sürpriz bir şekilde can veya mal kaybı yaşanmadı ancak 12 metre çapında bir krater çukuru açıldı ve patlama neredeyse şehrin tamamında hissedildi.';
    

    使用 ALLOWED_NUM_OF_CHARS = 300 设置调用后

    echo PrintBrief ($str);
    

    输出是:

    şğıöç İĞŞ ĞŞĞŞ Öİ ÇÇ Orta Amerika'nın en büyük ülkesi Nikaragua'nın başkenti Managua dün sabaha karşı büyük bir patlamayla sarsıldı. Olayın, şehre düşen ufak bir meteoit sonucu açılan krater çukurundan kaynaklandığı anlaşıldı。 1 milyon 200 bin kişinin yaşadığı ve bünyesinde ulsulararası bir ...

    【讨论】:

      猜你喜欢
      • 2011-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-03
      • 1970-01-01
      • 2013-04-04
      • 1970-01-01
      相关资源
      最近更新 更多