Peter: String intelligent kürzen

Guten Abend,

ich stehe vor dem Problem einen String zu kürzen. Und zwar liegt das
Problem darin, die HTML-Tags dabei zu ignorieren und nur ganze Wörter
zu bahndeln.
Habe bereits verschiedene Ansätze probiert, doch führt leider keiner
zum Ziel. Im Archiv habe ich auch gestöbert, doch deckten die
gefundenen Beiträge meinen Fall nicht so recht ab.

Ich wäre dankbar, wenn sich das mal einer anschauen würde.

===Beispiel-Code===

  
Bsp:  
Alles was <a href="www.dummy.com">irgendwie</a> nützt  
         ^10        ^20        ^30        ^40        ^50  
  
Auf 20 Character gekürzt sollte herauskommen:  
Alles was irgendwie  
         ^10        ^20  

===Ansatz 1===
1. HTML-Tags entfernen.
2. Text kürzen
3. Letzte Wörter/Letztes Wort merken
4. Position des ^Wortes im echten String (der mit HMTL-Tags) ermitteln
5. anhand ^ Position kürzen
Problemfall:
Kürzen auf zum Beispiel 19 (siehe Bsp-String)
Wie kann ich verhindern, dass beim Kürzen auf 19 Character nicht der
A-Tag geöffnet bleibt und mir sämtliche folgenden Ausgaben komplett
verlinkt? (Ergebnis würde führen zu: Alles was <a href="www.dummy.com">irgendwie)

===Ansatz 2===
1. while($ok===false)
2.  Mit gewünschter Position anfangen und Text bis dorthin schneiden
3.  Überprüfen, ob String von HMTL-Tags ummantelt wird
4.  Wenn ja, dann continue() (Intervall von zB 5 Character)
5.  HTML-Tags entfernen.
6.  ^Anzuzeigende Charcater Länge auslesen
7.  Wenn Länge >= gewünschter Position
8.  => dann => String zurückgeben

===Bisheriger Code===

  
function trimString($string,$charCut)  
 {  
  /* If Length of String is less then $charCut return */  
  if($charCut>=strlen($string))  
   return $string;  
  
  /* First remove HTML-Tags in order to trim displayable String only */  
  $extStr = $this->removeHTMLTags($string);  
  $cutString = "";  
  $ind = 0;  
  while(strlen($cutString)<$charCut && $ind<$charCut)  
  {  
   $ind++;  
   echo "<br>".$charCut." - ".$cutString;  
    $cutString = substr($extStr, 0, strpos($extStr, " "));  
    $cutString = str_replace("&nbsp;", " ", $cutString);  
    $extStr = substr_replace($extStr, "&nbsp;", strpos($extStr, " "), 1);  
  }  
  
  /* We keep the last Characters of trimmed String in mind */  
  $suffix = substr($cutString,strlen($cutString)-10);  
  
  /* Search in real entire String for first Occurance of the String we kept in Mind */  
  $pos = strpos ($string, $suffix);  
  
  /* If String could not be found cut lazily and return */  
  if ($pos === false || $pos < $charCut)  
   return substr($string,0,$charCut);  
  
  return substr($string,0,$pos);  
}  

Grüße aus Berlin
Peter S.

  1. Ich würde das so machen:

    *Html-tags entfernen
    *Text ohne HTML-Tags in ein array splitten (mit explode() oder split() ), sodass jedes Wort einen eigenen Array-Eintrag hat. Im einfachsten Fall einfach immer an Leerzeichen trennen.
    *Solange Wörter aus den Array aneinander ketten, bis die maximale Länge überschritten wird oder gerade unterschritten wird.

    1. Hallo,

      Ich würde das so machen:

      *Html-tags entfernen

      Am besten mit strip_tags().

      *Text ohne HTML-Tags in ein array splitten (mit explode() oder split() ), sodass jedes Wort einen eigenen Array-Eintrag hat. Im einfachsten Fall einfach immer an Leerzeichen trennen.

      Zum Trennen würde ich preg_split('/\s+/', $text) verwenden. So werden auch Zeilenumbrüche und mehrfach vorkommende Leerzeichen als Wortgrenzen erfasst.

      *Solange Wörter aus den Array aneinander ketten, bis die maximale Länge überschritten wird oder gerade unterschritten wird.

      Aber dabei ist zu beachten, dass die jetzt fehlenden Leerzeichen wieder mitgezählt und beim Zusammenbauen der Teilstrings eingefügt werden.

      MffG
      EisFuX

      --
      Erinnert mich ein Bisschen an die if-then-Schleifen von Java.
      (Alexandra Freund, IT-Compactkurs)