2014-12-26 6 views
7

Ich habe ein Kommentar-System in meiner Website und einige Benutzer schreiben sehr lange Kommentare, länger als 500 Zeichen und ich muss es nach 200 schneiden und die Option "siehe mehr" hinzufügen. Das Problem ist, dass Benutzer <a>test</a> Tags verwenden können und in einigen Fällen das Limit von 200 Zeichen schneidet das Tag in der Mitte, wie <a>t oder <a oder <a>test</ Wenn einer der oben genannten Fälle auftritt, sollte das Limit bis zum Ende des HTML-Tags verlängert werden so ex <a>test</a>Text nach HTML schneiden ein Ende Tag

ich habe diesen Code:

function truncate($string,$length=200,$append="&hellip;") { 
    $string = trim($string); 

    if(strlen($string) > $length) { 
    $string = wordwrap($string, $length); 
    $string = explode("\n", $string, 2); 
    $string = $string[0] . $append; 
    } 

    return $string; 
} 

Jede Idee, wie diese zu machen?

Dank

+0

schreiben eine eigene Funktion tagCatcher (den gesamten Text übergeben) In der Funktion eine schnelle Überprüfung für einen Satz von Tags schreiben, die verwendet werden können. Wenn Sie eine Datenbank verwenden, um die Tags zu verfolgen, können Sie einfach eine Abfrage durchführen. Nur ein Vorschlag, keine Antwort. In Ihrer Funktion können Sie bis zu 200 Zeichen zählen und dann nach einem '<' suchen, wenn es kein entsprechendes '>' hat, und dann nach dem '/>'. –

+1

Angenommen, Sie könnten es einfach in diese Funktion schreiben . Ich schreibe etwas auf. –

+0

Kennen Sie die obigen Arbeiten? –

Antwort

4

Nun, ich denke, ich habe es getan. Wenn jemand einen Vorschlag hat, können Sie diese Antwort oder Ihren Kommentar ändern.

function cut_text($string,$length=350,$append="&hellip;") { 

    $string = trim($string); 
    $string_length = strlen($string); 

    $original_string = $string; 

    if($string_length > $length) { 

    $remaining_chars = $string_length - $length; 

    if(strpos($string, '<') !== false && strpos($string, '>') !== false) { 

     $string = wordwrap($string, $length); 
     $string = explode("\n", $string, 2); 
     $string = $string[0] . $append; 

     $fillimi = substr_count($string, '<'); 
     $fundi = substr_count($string, '>'); 

     if($fillimi == $fundi) { 
     $string = $string; 
     } else { 
     $i = 1; 
     while($i <= $remaining_chars) { 

      $string = wordwrap($original_string, $length + $i); 
      $string = explode("\n", $string, 2); 
      $new_remaining_chars = $string_length - ($length + $i); 
      if($new_remaining_chars > 0) { 
      $string = $string[0] . $append; 
      } else { 
      $string = $string[0]; 
      } 

      $fillimi = substr_count($string, '<'); 
      $fundi = substr_count($string, '>'); 

      if($fillimi == $fundi) { 
      $string = $string; 
      break; 
      } 

      $i++; 
     } 
     } 

    } else { 
     $string = trim($string); 

     $string = wordwrap($string, $length); 
     $string = explode("\n", $string, 2); 
     $string = $string[0] . $append; 

    } 

    } 

    return $string; 
} 
+0

mein einziges Problem damit ist, dass es die Nummer < and > zählt und nicht ob es ein Tag ist oder nicht. Jemand könnte

+0

Ja, aber es ist immer noch kein Problem. Ich habe es getestet und es funktioniert perfekt. – zeeks

+1

Dies ist die Antwort, kann aber mehr definiert werden, um Probleme auf dem Weg zu berücksichtigen. Gute Arbeit. –

1

ich glaube, es dies bereits irgendwo im Internet sein soll, war aber nicht in der Lage, es zu finden. Was Sie im Grunde tun müssen, ist, die geöffneten Tags zu zählen, und wenn es mehr geöffnete Tags als geschlossen gibt, ist es offen und kann noch nicht schneiden. Here ist etwas, um Sie in die richtige Richtung zu drücken, wie Sie die Anzahl der geöffneten und geschlossenen Tags einfach zählen können.

+0

Ich denke, dies sollte ein Kommentar sein, es war die Lösung in geschriebenem Wort, also habe ich dies zurück auf Null gewählt. –

+0

@KirsKringle: Danke dafür. Ich stimme darin überein, dass ich mehr dafür hätte tun sollen. –