2010-10-23 4 views
0

J'essaie d'ajouter une ellipse à la fin des chaînes tronquées que cette fonction php produit. Cela fait partie d'un plugin Wordpress. Mais hélas, je suis en train d'apprendre php ....Ajouter des points de suspension à la fin de la chaîne tronquée dans le plugin WordPress

J'ai essayé d'imprimer les points de suspension juste avant la balise html se terminant à la fin de la fonction, comme celui-ci

$truncate .= '... </' . $tag . '>';

mais pas la chance. Des idées? Cela doit être assez simple.

est ici toute la fonction:

if(!function_exists('yd_cake_truncate')) { 
    function yd_cake_truncate($text, $length = 100, $ending = '...', $exact = true, $considerHtml = false) { 
     if ($considerHtml) { 
      // if the plain text is shorter than the maximum length, return the whole text 
      if (strlen(preg_replace('/<.*?>/', '', $text)) <= $length) { 
       return $text; 
      } 

      // splits all html-tags to scanable lines 
      preg_match_all('/(<.+?>)?([^<>]*)/s', $text, $lines, PREG_SET_ORDER); 

      $total_length = strlen($ending); 
      $open_tags = array(); 
      $truncate = ''; 

      foreach ($lines as $line_matchings) { 
       // if there is any html-tag in this line, handle it and add it (uncounted) to the output 
       if (!empty($line_matchings[1])) { 
        // if it's an "empty element" with or without xhtml-conform closing slash (f.e. <br/>) 
        if (preg_match('/^<(\s*.+?\/\s*|\s*(img|br|input|hr|area|base|basefont|col|frame|isindex|link|meta|param)(\s.+?)?)>$/is', $line_matchings[1])) { 
         // do nothing 
         // if tag is a closing tag (f.e. </b>) 
        } else if (preg_match('/^<\s*\/([^\s]+?)\s*>$/s', $line_matchings[1], $tag_matchings)) { 
         // delete tag from $open_tags list 
         $pos = array_search($tag_matchings[1], $open_tags); 
         if ($pos !== false) { 
          unset($open_tags[$pos]); 
         } 
         // if tag is an opening tag (f.e. <b>) 
        } else if (preg_match('/^<\s*([^\s>!]+).*?>$/s', $line_matchings[1], $tag_matchings)) { 
         // add tag to the beginning of $open_tags list 
         array_unshift($open_tags, strtolower($tag_matchings[1])); 
        } 
        // add html-tag to $truncate'd text 
        $truncate .= $line_matchings[1]; 
       } 

       // calculate the length of the plain text part of the line; handle entities as one character 
       $content_length = strlen(preg_replace('/&[0-9a-z]{2,8};|&#[0-9]{1,7};|&#x[0-9a-f]{1,6};/i', ' ', $line_matchings[2])); 
       if ($total_length+$content_length> $length) { 
        // the number of characters which are left 
        $left = $length - $total_length; 
        $entities_length = 0; 
        // search for html entities 
        if (preg_match_all('/&[0-9a-z]{2,8};|&#[0-9]{1,7};|&#x[0-9a-f]{1,6};/i', $line_matchings[2], $entities, PREG_OFFSET_CAPTURE)) { 
         // calculate the real length of all entities in the legal range 
         foreach ($entities[0] as $entity) { 
          if ($entity[1]+1-$entities_length <= $left) { 
           $left--; 
           $entities_length += strlen($entity[0]); 
          } else { 
           // no more characters left 
           break; 
          } 
         } 
        } 
        $truncate .= substr($line_matchings[2], 0, $left+$entities_length); 
        // maximum lenght is reached, so get off the loop 
        break; 
       } else { 
        $truncate .= $line_matchings[2]; 
        $total_length += $content_length; 
       } 

       // if the maximum length is reached, get off the loop 
       if($total_length>= $length) { 
        break; 
       } 
      } 
     } else { 
      if (strlen($text) <= $length) { 
       return $text; 
      } else { 
       $truncate = substr($text, 0, $length - strlen($ending)); 
      } 
     } 

     // if the words shouldn't be cut in the middle... 
     if (!$exact) { 
      // ...search the last occurance of a space... 
      $spacepos = strrpos($truncate, ' '); 
      if (isset($spacepos)) { 
       // ...and cut the text in this position 
       $truncate = substr($truncate, 0, $spacepos); 
      } 
     } 

     // add the defined ending to the text 
     $truncate .= $ending; 

     if($considerHtml) { 
      // close all unclosed html-tags 
      foreach ($open_tags as $tag) { 
        $truncate .= '</' . $tag . '>'; 
      } 
     } 

     return $truncate; 

    } 
} 

Répondre

1

La signature de la fonction ressemble il ajoute des ellipses à la fin de la chaîne tronquée par défaut en utilisant l'argument $ending:

yd_cake_truncate($text, $length = 100, $ending = '...', $exact = true, $considerHtml = false)

En regardant plus , $ending est ajouté à la chaîne tronquée à la fin de la fonction:

// add the defined ending to the text 
    $truncate .= $ending; 

Comment appelez-vous cette fonction lorsque vous essayez de l'utiliser?

+0

Pourrait utiliser le code de l'ellipse au lieu de trois arrêts complets, … – pharalia

+0

Vous avez raison; n'a pas vu ça. Le widget offre le choix de montrer soit le titre du post ou l'extrait, et cela ajoute une ellipse à l'extrait, mais pas le titre. Il me semble que 'return $ truncate' renvoie le html de la sortie, mais je ne sais pas avec certitude. D'autres fonctions gèrent les vignettes, mais c'est la seule fonction qui gère la troncature. – markratledge

+0

Si la fonction reçoit le texte avec html, elle retournera le texte tronqué avec html, faisant un peu de travail pour s'assurer que le html lui-même n'est pas compté par rapport à la longueur de la ligne. Vous pourriez vouloir regarder où le plugin branches avec le choix pour utiliser le titre du poste ou un extrait. Mon intuition est que cette fonction est appelée pour les extraits, mais pas pour les post-titres, et que l'appeler dans le cas du titre du post devrait obtenir le résultat que vous voulez. – andrewle

Questions connexes