Question

Je suis en train d'obtenir cette méthode dans un travail de filtre à cordes:

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

Je m'y attendais

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

et aussi ce

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

C'est $chars moins les caractères de la chaîne de $terminator.

En outre, le filtre est censé couper à la première limite de mot inférieure à la limite de $chars, par exemple.

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

Je suis assez certain que cela devrait fonctionner avec ces étapes

  • quantité de soustraction de caractère dans terminateur de caractères maximum
  • valider cette chaîne est plus longue que la limite calculée ou retourner inchangé
  • trouver le dernier caractère de l'espace dans la chaîne ci-dessous limite calculée pour obtenir limite de mot
  • chaîne de coupe à la dernière limite calculée espace ou si aucun dernier espace est trouvé
  • ajouter à terminaison chaîne
  • chaîne de retour

Cependant, j'ai essayé différentes combinaisons de fonctions de str* et mb_* maintenant, mais tous donné des résultats erronés. Cela ne peut pas être si difficile, donc je suis évidemment manque quelque chose. Quelqu'un aurait-il partager une mise en œuvre pour ce travail ou me pointer vers une ressource où je peux enfin comprendre comment le faire.

Merci

P.S. Oui, j'ai vérifié https://stackoverflow.com/search?q=truncate+string+php avant:)

Était-ce utile?

La solution

Essayez ceci:

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;
}

Mais vous devez vous assurer que votre encodage interne est correctement réglé.

Autres conseils

Juste a découvert PHP a déjà un multi-octets avec tronquer

Il ne respecte pas les limites de mots bien. Mais à portée de main quand même!

Je n'aime généralement pas à coder juste une réponse entière à une question comme ça. Mais aussi je viens de me réveiller, et je pensais que votre question me obtenir dans une bonne humeur pour aller programme pour le reste de la journée.

Je n'ai pas essayé de courir, mais il devrait fonctionner ou tout au moins vous obtenez 90% du chemin.

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;
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top