2010-07-01 3 views
7

Hier ist, was für mich nicht funktioniert:PHP limit text string NICHT inklusive html tags?

<?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; 
?> 

ich den sichtbaren Text auf 100 Zeichen beschränken möchten, aber substr() verwendet, ist auch einschließlich der nicht sichtbaren Text in der Grenze (<a href="http://www.jackismydog.com"> und </a>), die 41 aufgreift von diesen verfügbaren 100 Zeichen.

Gibt es eine Möglichkeit, den Text zu begrenzen, so dass das Wort "Jack" von der Verbindung in der Grenze enthalten wäre, aber nicht <a href="http://www.jackismydog.com"> oder </a>?

Edit: ich den Link in der Kette halten wollen, zählen einfach nicht Länge in Richtung der Grenze ist ..

Antwort

4

Ein Funktionswörter in HTML-Code zu kürzen:

//+ 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; 
} 

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

2

Wenn Sie den Textteil beschränken möchten, müssen Sie es analysieren und die Grenze selbst überprüfen . Der einfachste Weg ist es,

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

Vergessen Sie nicht, 'strlen' durch' mb_strlen' ersetzen, wenn der Text Multibyte ist. – machineaddict

2

nicht leicht - Sie natürlich strip_tags verwenden könnten die Zeichenfolge de-htmlise, aber anders als das es keine einfache Lösung.

+0

Lösung für mein Problem! Danke :) – yanike

3

Der einfachste Weg wäre, dies in eine DOM-Struktur zu zerlegen. Sie könnten DOMDocument dafür verwenden. Dann könnten Sie einfach die Elemente durchgehen und Änderungen am Inhalt vornehmen. Ein anderer Ansatz wäre, einen Regex mit zwei Durchläufen zu suchen und zu ersetzen - verwenden Sie zuerst die Regex, um den Inhalt von Tags zu finden, und verwenden Sie dann die Regex, um den Inhalt durch verkürzten Inhalt zu ersetzen. Dies kann mit Ihren üblichen preg_ * -Funktionen erreicht werden.

1

du versuchen könnte, für mich gearbeitet, wenn keine Tags in string $ sind abweichen einen Wert von 0 Gebens haben $ stringize Ihren ursprünglichen Wert von 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); sollte $ stringnohtml = strlen ($ striphtml) sein; – raison