2010-11-23 10 views
33

J'ai du texte stocké dans la variable php $ text. Ce texte peut être de 100, 1000 ou 10000 mots. Comme actuellement implémenté, ma page s'étend sur la base du texte, mais si le texte est trop long, la page semble moche. Je veux obtenir la longueur du texte et limiter le nombre de caractères à peut-être 500, et si le texte dépasse cette limite, je veux fournir un lien disant, "Lire la suite". Si le lien "Lire la suite" est cliqué, il affichera un pop avec tout le texte dans $ text.limite la longueur du texte en php et fournit le lien 'Read more'

+7

Avez-vous essayé quelque chose? En ce moment, cela ressemble à "plz donnez-moi le codez" –

+0

peut-il y avoir un balisage dans $ text? – Gordon

Répondre

114

C'est ce que j'utilise:

// strip tags to avoid breaking any html 
$string = strip_tags($string); 
if (strlen($string) > 500) { 

    // truncate string 
    $stringCut = substr($string, 0, 500); 
    $endPoint = strrpos($stringCut, ' '); 

    //if the string doesn't contain any space then it will cut without word basis. 
    $string = $endPoint? substr($stringCut, 0, $endPoint):substr($stringCut, 0); 
    $string .= '... <a href="/this/story">Read More</a>'; 
} 
echo $string; 

Vous pouvez modifier davantage, mais il fait le travail dans la production.

+1

Merci pour la réponse, mais après avoir utilisé strip_tags ($ strings), le html est perdu, comment puis-je après avoir réduit la longueur de la chaîne conserver le retour html qui était auparavant présent – harshal

+0

@harshal Le 'strip_tags' est là parce que la plupart des sites I Avons travaillé sur des textes en texte simple (qui ensuite lier à la page avec l'article entièrement formaté). Si vous souhaitez conserver le code HTML, vous pouvez utiliser un analyseur XML pour récupérer les valeurs de texte de chaque sous-élément, en accumulant le nombre de caractères tout en recherchant la casse possible des étiquettes. C'est un problème beaucoup plus complexe et bien au-delà de la portée de cette question. – webbiedave

+0

@Webbiedave quel est le href ici ?? désolé je n'ai pas compris c'est pourquoi j'ai demandé ?? devrait-il pointer vers la page de soi ou autre chose? –

0

Fondamentalement, vous devez intégrer un limiteur de mots (par exemple something like this) et utiliser quelque chose comme shadowbox. Votre lien lire plus devrait lier à un script PHP qui affiche l'article entier. Il suffit d'installer Shadowbox sur ces liens et vous êtes prêt. (Voir les instructions sur leur site est facile..)

2

utilisation simple que cela bande le texte:

echo strlen($string) >= 500 ? 
substr($string, 0, 490) . ' <a href="link/to/the/entire/text.htm">[Read more]</a>' : 
$string; 

Modifier et enfin:

function split_words($string, $nb_caracs, $separator){ 
    $string = strip_tags(html_entity_decode($string)); 
    if(strlen($string) <= $nb_caracs){ 
     $final_string = $string; 
    } else { 
     $final_string = ""; 
     $words = explode(" ", $string); 
     foreach($words as $value){ 
      if(strlen($final_string . " " . $value) < $nb_caracs){ 
       if(!empty($final_string)) $final_string .= " "; 
       $final_string .= $value; 
      } else { 
       break; 
      } 
     } 
     $final_string .= $separator; 
    } 
    return $final_string; 
} 

Ici séparateur est le lien href pour en savoir plus ;)

+0

Vous réalisez que 500 LETTRES, pas des mots, rite?: D En outre, cela peut complètement casser le code du côté, s'il y a du code HTML (peut entraîner comme ...) –

+0

Ok, alors utilisez strip_tags() à l'intérieur;) – CrazyMax

+0

Cela pourrait couper un mot. – Aif

8
$num_words = 101; 
$words = array(); 
$words = explode(" ", $original_string, $num_words); 
$shown_string = ""; 

if(count($words) == 101){ 
    $words[100] = " ... "; 
} 

$shown_string = implode(" ", $words); 
+0

vous pouvez changer le "..." à un lien vers plus d'informations, ou le faire ouvrir un div avec le bloc entier de texte sur la même page. Beaucoup d'options .. –

+0

s'il vous plaît formater votre réponse la prochaine fois. il existe des boutons appropriés en haut de la zone de texte – stillstanding

+0

Comme il s'agit d'un problème de mise en forme, il est préférable de limiter le nombre de caractères plutôt que le nombre de mots car les mots seront de longueur variable. – webbiedave

0

Cette méthode ne tronque pas un mot au milieu.

list($output)=explode("\n",wordwrap(strip_tags($str),500),1); 
echo $output. ' ... <a href="#">Read more</a>'; 
0

Une autre méthode: insérez ce qui suit dans le fichier function.php de votre thème.

remove_filter('get_the_excerpt', 'wp_trim_excerpt'); 
add_filter('get_the_excerpt', 'custom_trim_excerpt'); 

function custom_trim_excerpt($text) { // Fakes an excerpt if needed 
global $post; 
if ('' == $text) { 
$text = get_the_content(''); 
$text = apply_filters('the_content', $text); 
$text = str_replace(']]>', ']]>', $text); 
$text = strip_tags($text); 
$excerpt_length = x; 
$words = explode(' ', $text, $excerpt_length + 1); 
if (count($words) > $excerpt_length) { 
array_pop($words); 
array_push($words, '...'); 
$text = implode(' ', $words); 
} 
} 
return $text; 
} 

Vous pouvez l'utiliser.

0
<?php 
    $images_path = 'uploads/adsimages/'; 
      $ads = mysql_query("select * from tbl_postads ORDER BY ads_id DESC limit 0,5 "); 
        if(mysql_num_rows($ads)>0) 
        { 
         while($ad = mysql_fetch_array($ads)) 

         {?> 


    <div style="float:left; width:100%; height:100px;"> 
    <div style="float:left; width:40%; height:100px;"> 
     <li><img src="<?php echo $images_path.$ad['ads_image']; ?>" width="100px" height="50px" alt="" /></li> 
     </div> 

     <div style="float:left; width:60%; height:100px;"> 
     <li style="margin-bottom:4%;"><?php echo substr($ad['ads_msg'],0,50);?><br/> <a href="index.php?page=listing&ads_id=<?php echo $_GET['ads_id'];?>">read more..</a></li> 
     </div> 

    </div> 

    <?php }}?> 
+0

seules réponses de code ne sont pas vraiment les bienvenus – chouaib

0
<?php $string = "Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book."; 
if (strlen($string) > 25) { 
$trimstring = substr($string, 0, 25). ' <a href="#">readmore...</a>'; 
} else { 
$trimstring = $string; 
} 
echo $trimstring; 
//Output : Lorem Ipsum is simply dum [readmore...][1] 
?> 
3

je combiner deux réponses différentes:

  1. Limiter les caractères
  2. balises HTML complet manquantes

    $string = strip_tags($strHTML); 
    $yourText = $strHTML; 
    if (strlen($string) > 350) { 
        $stringCut = substr($post->body, 0, 350); 
        $doc = new DOMDocument(); 
        $doc->loadHTML($stringCut); 
        $yourText = $doc->saveHTML(); 
    } 
    $yourText."...<a href=''>View More</a>" 
    
0

mot de limite s dans le texte:

function limitTextWords($content = false, $limit = false, $stripTags = false, $ellipsis = false) 
{ 
    if ($content && $limit) { 
     $content = ($stripTags ? strip_tags($content) : $content); 
     $content = explode(' ', $content, $limit+1); 
     array_pop($content); 
     if ($ellipsis) { 
      array_push($content, '...'); 
     } 
     $content = implode(' ', $content); 
    } 
    return $content; 
} 

caractères limites dans le texte:

function limitTextChars($content = false, $limit = false, $stripTags = false, $ellipsis = false) 
{ 
    if ($content && $limit) { 
     $content = ($stripTags ? strip_tags($content) : $content); 
     $ellipsis = ($ellipsis ? "..." : $ellipsis); 
     $content = mb_strimwidth($content, 0, $limit, $ellipsis); 
    } 
    return $content; 
} 

Utilisation:

$text = "It is a long established fact that a reader will be distracted by the readable content of a page when looking at its layout."; 
echo limitTextWords($text, 5, true, true); 
echo limitTextChars($text, 5, true, true);