使用PHP mb函数将多字节字符串截断为大约n个单词


Truncate a multibyte string to approximately n words with PHP mb functions

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

要求是:

  1. 注意中编码的şığ等字符的multibyte languageUTF-8
  2. 能够确定允许的长度(通过使用字符数)
  3. 取长字符串的一部分后字符串必须有意义并连接"…"直到部分
  4. 必须考虑关键笔划(字符),而不是字节

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

关于

// 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ı。玉兰油ın,sh ehre düšen ufak bir meteroit sonucu açılan kraterçukurundan kaynaklandığı。1 milyon 200 bin kişinin yaşadığıve bünyesinde ulsularaasıbir。。。