Обрезать многобайтовую строку примерно до n слов с помощью функций PHP mb

После того, как я задал этот вопрос на SO, мне нужно было подготовить пользовательскую функцию PHP, чтобы получить краткую версию моей строки, потому что я не мог найти прямой ответ / код в сети.

Требования были:

  1. знать о multibyte language для таких персонажей, как ş, ı, ğ закодировано в UTF-8
  2. возможность определить допустимую длину (используя количество символов)
  3. после взятия части длинной строки слово в конце строки ДОЛЖНО быть значимым и объединять ' ...' до конца части
  4. должен учитывать нажатия клавиш (символы), а не байты

Читатели должны знать, что код работает, но я не эксперт. Я считаю, что можно достичь той же цели с помощью гораздо более эффективного или более продуманного кодирования. Как вы видите, код не имеет проблем с безопасностью, он только манипулирует входной строкой, если он длиннее допустимого.

С уважением

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 metroit sonucu açılan krater çukurundan kaynaklandığı anlaşıldı. 1 милон 200 бин, готовый к употреблению в...

Другие вопросы по тегам