2010-07-01 10 views
7

est ici ce qui ne fonctionne pas pour moi:PHP limite la chaîne de texte PAS les balises html?

<?php 
$string = 'I have a dog and his name is <a href="http://www.jackismydog.com">Jack</a> and I love him very much because he\'s my favorite dog in the whole wide world and nothing could make me not love him, I think.'; 
$limited = substr($string, 0, 100).'...'; 
echo $string; 
?> 

Je veux limiter le texte VISIBLE à 100 caractères, mais en utilisant substr() est également compris le texte non visible dans la limite (<a href="http://www.jackismydog.com"> et </a>) qui prend 41 de ceux disponibles 100 caractères.

Existe-t-il un moyen de limiter le texte afin que le mot "Jack" du lien soit inclus dans la limite, mais pas <a href="http://www.jackismydog.com"> ou </a>?

Edit: Je veux garder le lien dans la chaîne, comptez tout simplement pas sa longueur vers la limite ..

Répondre

4

Une fonction de tronquer mots dans le code HTML:

//+ Jonas Raoni Soares Silva 
//@ http://jsfromhell.com 
function truncate($text, $length, $suffix = '&hellip;', $isHTML = true) { 
    $i = 0; 
    $simpleTags=array('br'=>true,'hr'=>true,'input'=>true,'image'=>true,'link'=>true,'meta'=>true); 
    $tags = array(); 
    if($isHTML){ 
     preg_match_all('/<[^>]+>([^<]*)/', $text, $m, PREG_OFFSET_CAPTURE | PREG_SET_ORDER); 
     foreach($m as $o){ 
      if($o[0][1] - $i >= $length) 
       break; 
      $t = substr(strtok($o[0][0], " \t\n\r\0\x0B>"), 1); 
      // test if the tag is unpaired, then we mustn't save them 
      if($t[0] != '/' && (!isset($simpleTags[$t]))) 
       $tags[] = $t; 
      elseif(end($tags) == substr($t, 1)) 
       array_pop($tags); 
      $i += $o[1][1] - $o[0][1]; 
     } 
    } 

    // output without closing tags 
    $output = substr($text, 0, $length = min(strlen($text), $length + $i)); 
    // closing tags 
    $output2 = (count($tags = array_reverse($tags)) ? '</' . implode('></', $tags) . '>' : ''); 

    // Find last space or HTML tag (solving problem with last space in HTML tag eg. <span class="new">) 
    $pos = (int)end(end(preg_split('/<.*>| /', $output, -1, PREG_SPLIT_OFFSET_CAPTURE))); 
    // Append closing tags to output 
    $output.=$output2; 

    // Get everything until last space 
    $one = substr($output, 0, $pos); 
    // Get the rest 
    $two = substr($output, $pos, (strlen($output) - $pos)); 
    // Extract all tags from the last bit 
    preg_match_all('/<(.*?)>/s', $two, $tags); 
    // Add suffix if needed 
    if (strlen($text) > $length) { $one .= $suffix; } 
    // Re-attach tags 
    $output = $one . implode($tags[0]); 

    //added to remove unnecessary closure 
    $output = str_replace('</!-->','',$output); 

    return $output; 
} 

Source: http://snippets.dzone.com/posts/show/7125

2

Si vous voulez limiter la partie de texte, vous devez analyser et vérifier la limite vous-même . Le plus simple est de:

if (strlen(strip_tags($string)) > 100) 
{ 
    // the url inside $url is too big 
} 
else 
{ 
    // the url inside $url fits 
} 
+0

N'oubliez pas de remplacer 'strlen' par' mb_strlen' si le texte est multi-octets. – machineaddict

2

pas facilement - vous pouvez bien sûr utiliser strip_tags à de-htmlise la chaîne, mais à part qu'il n'y a pas de solution facile.

+0

Solution à mon problème! Merci :) – yanike

3

Le moyen le plus simple serait de réellement analyser ceci dans une structure DOM. Vous pouvez utiliser DOMDocument pour cela. Ensuite, vous pouvez simplement parcourir les éléments et apporter des modifications au contenu.

Une autre approche serait de faire une recherche et un remplacement regex à deux passages - d'abord utiliser la regex pour trouver le contenu des étiquettes, puis utiliser la regex pour remplacer le contenu par un contenu raccourci. Cela peut être réalisé avec vos fonctions habituelles de preg_ *.

1

Vous pouvez essayer cela, a fonctionné pour moi si aucune balise sont en chaîne $ diffèrent aura une valeur de 0 donner $ stringsize votre valeur d'origine de 100

<?php 
$string = 'I have a dog and his name is <a href="http://www.jackismydog.com">Jack</a> and I love him very much because he\'s my favorite dog in the whole wide world and nothing could make me not love him, I think.'; 

$stringall=strlen($string); 
$striphtml = strip_tags($string); 
$stringnohtml=strlen(striphtml); 
$differ=($stringall-$stringnohtml); 
$stringsize=($differ + 100); 
$limited = substr($string, 0, $stringsize).'...'; 
echo $limited; 
?> 
+0

$ stringnohtml = strlen (striphtml); devrait être $ stringnohtml = strlen ($ striphtml); – raison