2013-06-01 2 views
8

je suis venu avec cette fonction qui tronque une chaîne donnée soit le nombre donné de mots ou le nombre de caractères donné tout ce qui est plus court. Puis, après il coupe tout après le nombre de limite de caractères ou de mots, il joint une « ... » à la chaîne.chaîne de troncature, mais retirez milieu de chaîne au lieu de fin

Comment puis-je supprimer les caractères/et les remplacer par des mots à partir du milieu de la chaîne avec « ... » au lieu de remplacer les caractères/mots à la fin de la « ... »?

Voici mon code:

function truncate($input, $maxWords, $maxChars){ 
    $words = preg_split('/\s+/', $input); 
    $words = array_slice($words, 0, $maxWords); 
    $words = array_reverse($words); 

    $chars = 0; 
    $truncated = array(); 

    while(count($words) > 0) 
    { 
     $fragment = trim(array_pop($words)); 
     $chars += strlen($fragment); 

     if($chars > $maxChars){ 
      if(!$truncated){ 
       $truncated[]=substr($fragment, 0, $maxChars - $chars); 
      } 
      break; 
     } 

     $truncated[] = $fragment; 
    } 

    $result = implode($truncated, ' '); 

    return $result . ($input == $result ? '' : '...'); 
} 

Par exemple, si truncate('the quick brown fox jumps over the lazy dog', 8, 16); est appelé, 16 caractères est plus courte de sorte que est la troncature qui va se passer. Ainsi, «les sauts de renard sur le chien paresseux» seront enlevés et «...» sera ajouté.

Mais, au contraire, comment puis-je avoir la moitié de la limite de caractères viennent du début de la chaîne et la moitié viennent de la fin de la chaîne et ce qui est enlevé au milieu remplacé par « ... »? Ainsi, la chaîne que je suis à la recherche d'être de retour dans ce domaine, l'un, le cas serait: «le chien Quic ... paresseux.

Répondre

21
$text = 'the quick brown fox jumps over the lazy dog'; 
$textLength = strlen($text); 
$maxChars = 16; 

$result = substr_replace($text, '...', $maxChars/2, $textLength-$maxChars); 

$ result est maintenant:

the quic...lazy dog 
+1

+1 simple et belle. – Orangepill

+3

besoin d'un 'if ($ textLength> $ maxChars)' – Petah

+1

Notez que cela se traduit par une chaîne qui est de 19 caractères, même si est fixé à 16 $ maxChars. – adean

0

Voici ce que je fini par utiliser:

/** 
* Removes characters from the middle of the string to ensure it is no more 
* than $maxLength characters long. 
* 
* Removed characters are replaced with "..." 
* 
* This method will give priority to the right-hand side of the string when 
* data is truncated. 
* 
* @param $string 
* @param $maxLength 
* @return string 
*/ 
function truncateMiddle($string, $maxLength) 
{ 
    // Early exit if no truncation necessary 
    if (strlen($string) <= $maxLength) return $string; 

    $numRightChars = ceil($maxLength/2); 
    $numLeftChars = floor($maxLength/2) - 3; // to accommodate the "..." 

    return sprintf("%s...%s", substr($string, 0, $numLeftChars), substr($string, 0 - $numRightChars)); 
} 

Pour mon cas d'utilisation du côté droit de la chaîne contient des informations plus utiles afin cette méthode est biaisée pour sortir les personnages de la moitié gauche.

1

Cela ne modifiera pas l'entrée qui est plus courte que $maxChars, et prend la longueur du remplacement ... en compte:

function str_truncate_middle($text, $maxChars = 25, $filler = '...') 
{ 
    $length = strlen($text); 
    $fillerLength = strlen($filler); 

    return ($length > $maxChars) 
     ? substr_replace($text, $filler, ($maxChars - $fillerLength)/2, $length - $maxChars + $fillerLength) 
     : $text; 
} 
Questions connexes