69 votes

Comment puis-je tronquer une chaîne de caractères aux 20 premiers mots en PHP ?

Comment puis-je tronquer une chaîne de caractères après 20 mots en PHP ?

1 votes

Vous pourriez trouver s($str)->words(20) utile, comme on le trouve dans cette bibliothèque autonome .

149voto

karim79 Points 178055
function limit_text($text, $limit) {
    if (str_word_count($text, 0) > $limit) {
        $words = str_word_count($text, 2);
        $pos   = array_keys($words);
        $text  = substr($text, 0, $pos[$limit]) . '...';
    }
    return $text;
}

echo limit_text('Hello here is a long sentence that will be truncated by the', 5);

Sorties :

Hello here is a long ...

6 votes

Cette fonction confond le nombre de caractères et le nombre de mots en utilisant $limit dans un cas comme un sélecteur de mots du tableau $pos et dans un autre en déterminant si la chaîne est suffisamment longue.

0 votes

Dans l'exemple fourni, le fait de passer une valeur de 5 garantit que la fonction agira sur tout mot de longueur supérieure à 5 caractères. Ainsi, si le cas d'essai avait été "Hello here", la fonction échouerait et ne renverrait que "...".

0 votes

@Tegeril - noté, je vais supprimer ce message. Merci.

33voto

動靜能量 Points 33008

Modifier le numéro 3 au nombre 20 ci-dessous pour obtenir les 20 premiers mots, ou le passer en paramètre. L'exemple suivant montre comment obtenir les 3 premiers mots : (changez donc le paramètre 3 à 20 pour modifier la valeur par défaut) :

function first3words($s, $limit=3) {
    return preg_replace('/((\w+\W*){'.($limit-1).'}(\w+))(.*)/', '${1}', $s);   
}

var_dump(first3words("hello yes, world wah ha ha"));  # => "hello yes, world"
var_dump(first3words("hello yes,world wah ha ha"));   # => "hello yes,world"
var_dump(first3words("hello yes world wah ha ha"));   # => "hello yes world"
var_dump(first3words("hello yes world"));  # => "hello yes world"
var_dump(first3words("hello yes world.")); # => "hello yes world"
var_dump(first3words("hello yes"));  # => "hello yes"
var_dump(first3words("hello"));  # => "hello"
var_dump(first3words("a")); # => "a"
var_dump(first3words(""));  # => ""

2 votes

Incroyable, c'est le moyen le plus rapide à ce jour pour limiter les mots, cela fonctionne légèrement mieux qu'explode, bon travail, bien fait.

2 votes

Remarque : s'il y a des sauts de ligne dans votre chaîne, cette fonction tronquera tous les 20 mots pour chaque phrase (en supposant que vous ayez un saut de ligne après chaque phrase).

0 votes

Pour correspondre à travers les lignes ((\w+[\W|\s]*){'.($limit-1).'}\w+|\W|\s)(?:(.*|\s)) il faudra couper après pour les retours à la ligne.

14voto

Jackson Points 6654

Vers l'espace le plus proche

Tronque jusqu'à l'espace précédent le plus proche du caractère cible. Démo

  • $str La chaîne de caractères à tronquer
  • $chars Le nombre de caractères à supprimer peut être modifié par la fonction $to_space
  • $to_space boolean pour savoir s'il faut ou non tronquer de l'espace proche $chars limite

Fonction

function truncateString($str, $chars, $to_space, $replacement="...") {
   if($chars > strlen($str)) return $str;

   $str = substr($str, 0, $chars);
   $space_pos = strrpos($str, " ");
   if($to_space && $space_pos >= 0) 
       $str = substr($str, 0, strrpos($str, " "));

   return($str . $replacement);
}

Echantillon

<?php

$str = "this is a string that is just some text for you to test with";

print(truncateString($str, 20, false) . "\n");
print(truncateString($str, 22, false) . "\n");
print(truncateString($str, 24, true) . "\n");
print(truncateString($str, 26, true, " :)") . "\n");
print(truncateString($str, 28, true, "--") . "\n");

?>

Sortie

this is a string tha...
this is a string that ...
this is a string that...
this is a string that is :)
this is a string that is--

9voto

Matthew Vines Points 14425

Utiliser explode() .

Exemple tiré de la documentation.

// Example 1
$pizza  = "piece1 piece2 piece3 piece4 piece5 piece6";
$pieces = explode(" ", $pizza);
echo $pieces[0]; // piece1
echo $pieces[1]; // piece2

Notez que explode a une fonction limite. Vous pourriez donc faire quelque chose comme

$message = implode(" ", explode(" ", $long_message, 20));

1 votes

+1 WOW, j'utilise explode depuis toujours et je n'avais jamais remarqué l'argument $limit auparavant.

1 votes

La fonction limite d'Explode n'agit pas comme suggéré dans ce contexte. Voir php.net/manual/fr/function.explode.php Exemple n° 2, limite positive.

3 votes

@Tegeril a raison. Mais ceci devrait le réparer : $words = implode(" ", array_slice( explode(" ", $t), 0, $count) );

4voto

Andrew Hare Points 159332

Ça m'a l'air plutôt bien. :

Un problème courant lors de la création de dynamiques (où le contenu provient d'une d'une base de données, d'un gestionnaire de contenu ou d'une source externe telle qu'un flux flux RSS) est que le texte d'entrée peut être trop long et provoquer une " rupture " de la mise en page de la page.

Une solution consiste à tronquer le texte pour qu'il tienne sur la page. Ce site Cela semble simple, mais souvent les résultats résultats ne sont pas ceux escomptés, car les mots et des phrases sont coupés à des à des endroits inappropriés.

0 votes

En quoi est-ce une réponse à la question de l'OP ?

0 votes

@AndrewHare Je pense que vous allez trop loin dans la question.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X