2009-06-05 8 views
0

J'essaie de couper un morceau de texte à autour de 30 caractères. Si c'est plus court, je veux la chaîne précédente. En plus de cela, il a le code de style de forum po Je veux enlever tout entre crochets ([])Couper une chaîne vers le bas

J'utilise une paire de fonctions pour le faire. forum_extract est ce que j'appelle.

function forum_extract($text) { 
     return str_replace("\n",'<br />', limit_text(preg_replace('/\[[^\]]+\]/', '', $text), 30)); 
} 

function limit_text($text, $limit) { 
     if (strlen($text) <= $limit) 
       return $text; 

     $words = str_word_count($text, 2); 
     $pos = array_keys($words); 
     return substr($text, 0, $pos[$limit]) . '...'; 
} 

Le problème vient limit_text lorsque la condition $text est plus courte que la limite. Tout ce que je reçois est un "...".

Pour que cela se produise, il doit avoir passé la clause de garde au limit_text. Mais comment?

est ici un littéral qui est passé dans limit_text mais sort comme « ... »:

Friend of ours paid 150€ the other day from Malaga. Spread across 4 people it didn't seem to bad, given it was a 8+ hour day for the driver, petrol etc. 
+0

Pourriez-vous fournir un exemple d'entrée qui déclenche le problème? – soulmerge

+0

Ajouté un exemple cassé. – Oli

+2

Ce texte n'est certainement pas plus court tan 30 Chars :) – soulmerge

Répondre

2

Je pense que le problème est lié à votre déclaration $pos[$limit] car cela ne fonctionnera que si $limit est l'un des les clés contenues dans $pos et $pos est en fait un tableau basé sur 0 des positions numériques des mots respectifs dans votre chaîne.

Jetons un coup d'oeil à l'exemple de la PHP manual:

$str = "Hello fri3nd, you're 
    looking   good today!"; 
$words = str_word_count($str, 2); 
/* 
* Array 
* (
*  [0] => Hello 
*  [6] => fri 
*  [10] => nd 
*  [14] => you're 
*  [29] => looking 
*  [46] => good 
*  [51] => today 
*) 
*/ 

$pos = array_keys($words); 
/* 
* Array 
* (
*  [0] => 0 
*  [1] => 6 
*  [2] => 10 
*  [3] => 14 
*  [4] => 29 
*  [5] => 46 
*  [6] => 51 
*) 
*/ 

Sans avoir testé le code suivant, je vais essayer:

function limit_text($text, $limit) { 
    if (strlen($text) <= $limit) { 
      return $text; 
    } 

    $words = str_word_count($text, 2); 
    $cut_pos = strlen($text); 
    foreach ($words as $pos => $word) { 
     $end = $pos + strlen($word); 
     if ($end > $limit) { 
      $cut_pos = $end; 
      break; 
     } 
    } 
    return substr($text, 0, $cut_pos) . '...'; 
} 
1

Les trois dernières lignes de votre fonction limit_text sont Incorrect. Vous voulez probablement couper à une limite de mot. Je laisserais php faire cela en utilisant wordwrap():

$text = wordwrap($text, $limit - 3); 
# Or a bit faster (depending on your average string size, 
# wrapping 20kb of text could take some time): 
# $text = wordwrap(substr($text, 0, $limit), $limit - 3); 
if ($pos = (strpos($text, "\n"))) { 
    $text = substr($text, 0, $pos); 
} 
return $text . '...'; 
Questions connexes