Truncar um multibyte String para n chars

Estou tentando obter esse método em um Filtro de Cadeia de trabalho:

public function truncate($string, $chars = 50, $terminator = ' …'); 

Eu esperaria isso

 $in = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWYXZ1234567890"; $out = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUV …"; 

e também isso

 $in = "âãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿĀāĂ㥹ĆćĈĉĊċČčĎďĐđĒēĔĕĖėĘęĚěĜĝ"; $out = "âãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿĀāĂ㥹ĆćĈĉĊċČčĎďĐđ …"; 

Isso é $chars menos os caracteres da cadeia $terminator .

Além disso, o filtro deve cortar no limite da primeira palavra abaixo do limite $chars , por exemplo,

 $in = "Answer to the Ultimate Question of Life, the Universe, and Everything."; $out = "Answer to the Ultimate Question of Life, the …"; 

Estou certo de que isso deve funcionar com esses passos

  • quantidade restante de caracteres no terminador de caracteres máximos
  • valide que a string seja mais longa do que o limite calculado ou a deixe inalterada
  • encontre o último caractere de espaço na string abaixo do limite calculado para obter o limite de palavras
  • corte a corda no último espaço ou limite calculado se nenhum último espaço for encontrado
  • append terminador à string
  • corda de retorno

No entanto, tentei várias combinações de str* e mb_* funções agora, mas todos renderam resultados errados. Isso não pode ser tão difícil, então obviamente estou perdendo alguma coisa. Alguém compartilharia uma implementação de trabalho para isso ou me apontaria para um recurso onde eu posso finalmente entender como fazê-lo.

obrigado

PS Sim, chequei https://stackoverflow.com/search?q=truncate+string+php antes 🙂

Tente isso:

 function truncate($string, $chars = 50, $terminator = ' …') { $cutPos = $chars - mb_strlen($terminator); $boundaryPos = mb_strrpos(mb_substr($string, 0, mb_strpos($string, ' ', $cutPos)), ' '); return mb_substr($string, 0, $boundaryPos === false ? $cutPos : $boundaryPos) . $terminator; } 

Mas você precisa ter certeza de que sua codificação interna esteja corretamente configurada.

Apenas descobriu que o PHP já possui um multitote truncado com

  • mb_strimwidth – Obter uma string truncada com largura especificada

No entanto, não obedece aos limites das palavras. Mas útil, no entanto!

Normalmente, eu não gosto de codificar apenas uma resposta completa para uma pergunta como essa. Mas também acordei, e pensei que talvez sua pergunta me dê um bom humor para ir ao programa para o resto do dia.

Eu não tentei executar isso, mas deveria funcionar ou pelo menos obter 90% do caminho.

 function truncate( $string, $chars = 50, $terminate = ' ...' ) { $chars -= mb_strlen($terminate); if ( $chars < = 0 ) return $terminate; $string = mb_substr($string, 0, $chars); $space = mb_strrpos($string, ' '); if ($space < mb_strlen($string) / 2) return $string . $terminate; else return mb_substr($string, 0, $space) . $terminate; }