2010-01-20 3 views
8

Je tire des billets de blog d'une base de données. Je veux couper le texte à une longueur maximale de 340 caractères.Réduire le texte à 340 caractères

Si l'article de blog contient plus de 340 caractères, je veux couper le texte au dernier mot complet et ajouter '...' à la fin.

E.g. 

NOT: In the begin.... 

BUT: In the ... 
+4

Que voulez-vous faire? si l'utilisateur entre un seul mot de longueur 341 caractères (sans espaces du tout dans le message)? –

Répondre

11

Les autres réponses montrent comment vous pouvez rendre le texte environ 340 caractères. Si cela vous convient, utilisez l'une des autres réponses.

Mais si vous voulez un très strict maximum de 340 caractères, les autres réponses ne fonctionneront pas. Vous devez vous rappeler que l'ajout du '...' peut augmenter la longueur de la chaîne et vous devez en tenir compte.

$max_length = 340; 

if (strlen($s) > $max_length) 
{ 
    $offset = ($max_length - 3) - strlen($s); 
    $s = substr($s, 0, strrpos($s, ' ', $offset)) . '...'; 
} 

Notez également que ici j'utilise la surcharge de strrpos qui prend un décalage pour lancer la recherche directement à partir de l'emplacement correct dans la chaîne, plutôt que d'abord raccourcir la chaîne.

voir travailler en ligne: ideone

+0

ne ferait pas '$. = '...'' serait plus facile au lieu de la dernière étape? – silkAdmin

+1

@silkAdmin: Merci pour votre commentaire. J'ai apporté quelques améliorations à ma réponse. –

+0

Cool, assez vieux fil mais je suis sûr qu'il sera toujours utile pour beaucoup de gens! – silkAdmin

7

essayer:

preg_match('/^.{0,340}(?:.*?)\b/siu', $text, $matches); 
echo $matches[0] . '...'; 
+4

Par défaut, '.' ne correspond pas aux sauts de ligne. Donc, quand il y a des sauts de ligne avant le 340ème caractère, ça ne marchera pas. Ajouter un modificateur 's' à la fin fera l'affaire. –

26

Il semble que vous voulez d'abord couper le texte vers le bas, puis trouver exactement à 340 caractères l'emplacement du dernier « » dans la chaîne et réduire la voilure que montant. Comme ceci:

$string = substr($string, 0, 340); 
$string = substr($string, 0, strrpos($string, ' ')) . " ..."; 
+0

Nécessite un peu de polissage (vérifiez si la corde doit être raccourcie, etc.) mais court et doux. – adamJLev

0

vous pouvez essayer d'utiliser des fonctions qui vient avec PHP, comme wordwrap

print wordwrap($text,340) . "..."; 
0

de trim_characters fonction (texte $, $ length = 340) {

$length = (int) $length; 
$text = trim(strip_tags($text)); 

if (strlen($text) > $length) { 
    $text = substr($text, 0, $length + 1); 
    $words = preg_split("/[\s]| /", $text, -1, PREG_SPLIT_NO_EMPTY); 
    preg_match("/[\s]| /", $text, $lastchar, 0, $length); 
    if (empty($lastchar)) 
     array_pop($words); 

    $text = implode(' ', $words); 
} 

return $text; 

}

Utilisez cette fonction trim_characters() pour réduit une chaîne de mots à un nombre spécifié de caractères, en s'arrêtant gracieusement aux espaces blancs. Je pense que cela vous est utile.

2

Je mets la réponse de John Conde dans une méthode:

function softTrim($text, $count, $wrapText='...'){ 

    if(strlen($text)>$count){ 
     preg_match('/^.{0,' . $count . '}(?:.*?)\b/siu', $text, $matches); 
     $text = $matches[0]; 
    }else{ 
     $wrapText = ''; 
    } 
    return $text . $wrapText; 
} 

Exemples:

echo softTrim("Lorem Ipsum is simply dummy text", 10); 
/* Output: Lorem Ipsum... */ 

echo softTrim("Lorem Ipsum is simply dummy text", 33); 
/* Output: Lorem Ipsum is simply dummy text */ 

echo softTrim("LoremIpsumissimplydummytext", 10); 
/* Output: LoremIpsumissimplydummytext... */ 
13

Si vous avez l'extension mbstring activée (ce qui est sur la plupart des serveurs de nos jours), vous pouvez utiliser la fonction mb_strimwidth.

echo mb_strimwidth($string, 0, 340, '...'); 
+0

Tous saluent les doublures! Très belle prise :) – Gruber

+0

Tout à fait surpris pourquoi ce n'est pas le plus voté. Solution élégante .. – pihyper

0

Pourquoi?

  • J'aime la solution regex sur sous-chaîne, pour attraper tout autre que les pauses mot blancs (interpunction etc.)
  • solution de John Condoe n'est pas tout à fait correct, car il garniture texte à 340 caractères puis terminer le dernier mot (donc sera souvent plus que souhaité)

solution réelle regex est très simple :

/^(.{0,339}\w\b)/su 

méthode complète en PHP pourrait ressembler à ceci:

function trim_length($text, $maxLength, $trimIndicator = '...') 
{ 
     if(strlen($text) > $maxLength) { 

      $shownLength = $maxLength - strlen($trimIndicator); 

      if ($shownLength < 1) { 

       throw new \InvalidArgumentException('Second argument for ' . __METHOD__ . '() is too small.'); 
      } 

      preg_match('/^(.{0,' . ($shownLength - 1) . '}\w\b)/su', $text, $matches);        

      return (isset($matches[1]) ? $matches[1] : substr($text, 0, $shownLength)) . $trimIndicator ; 
     } 

     return $text; 
} 

Plus explication:

  • $shownLength est de garder la limite très stricte (comme Mark Byers mentionné)
  • exception est levée en cas longueur donnée était trop petite partie
  • \w\b est d'éviter les espaces ou interpunction au fin (voir 1 ci-dessous)
  • Dans le cas où premier mot serait plus longue que la longueur désirée max, ce mot sera brutalement coupé

  1. Malgré le fait que en question le résultat In the ... est décrit comme vous le souhaitez, je me sens In the... est plus lisse (n'aime pas In the,... etc.)
0

solution Simplest

$text_to_be_trim= "Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry standard."; 
if(strlen($text_to_be_trim) > 20) 
    $text_to_be_trim= substr($text_to_be_trim,0,20).'....'; 

Pour le texte multi-octets

$stringText= "UTIL CONTROL DISTRIBUCION AMARRE CIGÜEÑAL"; 
$string_encoding = 'utf8'; 
$s_trunc = mb_substr($stringText, 0, 37, $string_encoding); 
echo $s_trunc; 
+0

Celui-ci peut échouer lorsque vous rencontrez un caractère spécial. Je suis juste arrivé à moi avec ü. Si vous hachez là, ça échoue. Si vous allez un caractère plus loin, cela fonctionne. Donc, Mark Byers réponse est mon préféré. Fonctionne parfaitement. – mayid

+0

Pourriez-vous s'il vous plaît partager le texte qui doit être coupé? Alors que je peux vérifier ma solution .. –

+0

Bien sûr. Essayez ceci et découpez dans le Ü: "UTIL CONTROL DISTRIBUTION AMARRE CIGÜEÑAL". Lettre 40 pour moi. – mayid

Questions connexes