Ergebnis 1 bis 25 von 25

Thema: Zeichenkette kürzen - truncate

  1. #1
    Contao-Nutzer
    Registriert seit
    19.06.2009.
    Beiträge
    177

    Standard Zeichenkette kürzen - truncate

    Hallo,

    ich habe im Forum gesucht, aber keinen Hinweis auf die Lösung des folgenden Problems gefunden:

    Ich habe eine Liste von Events (Kalender), die ich mit Datum und Event-Titel in einer Randspalte anzeige. Nun ist manchmal der Titel des Events so lang, dass die Darstellung zweizeilig ist und nicht gut aussieht. Ich möchte daher, dass der Event-Titel nach xx Zeichen automatisch gekürzt wird, also z.B. aus
    01.01.10 Tolle Veranstaltung und noch viel mehr
    01.01.10 Tolle Veranstaltung und...
    gemacht wird. Kann ich das irgendwie im Template bewerkstelligen?

    Danke schon mal!
    Steve

  2. #2
    AG CMS-Garden
    Contao-Urgestein
    Avatar von lindesbs
    Registriert seit
    05.06.2009.
    Ort
    Oer-Erkenschwick
    Beiträge
    4.154
    Partner-ID
    keine
    User beschenken
    Wunschliste

    Standard

    Dafuer gibts bei den Labels im DC_TABLE list Bereich den Key maxCharacters

    Ist in der DC_TABLE definiert. Such danach, evt. kannst du den Source dort verwendet. Als eigenstaendige Funktion gibt es das leider "noch" nicht.
    von Willi Voltz aus PR 500: Henry George sagte einmal: »Kultur ist Zusammenarbeit.«


    Contao-Hosting: begeisterter Uberspace-Nutzer

  3. #3
    Contao-Urgestein Avatar von Andreas
    Registriert seit
    19.06.2009.
    Ort
    Mönchengladbach
    Beiträge
    7.703
    User beschenken
    Wunschliste
    Contao-Projekt unterstützen

    Support Contao

    Information

    Schaut euch mal die Funktionen in String.php an, damit müsste das eigentlich zu machen sein. substr() bzw. substrHtml() Die Klasse String muss aber erst importiert werden.

    PHP-Code:
    $this->import('String'); 
    dann:

    PHP-Code:
    echo $this->String->substrHtml($deinString10); 
    Andreas

  4. #4
    Administrator Avatar von Nina
    Registriert seit
    04.06.2009.
    Ort
    Hamburg
    Beiträge
    4.755
    Contao-Projekt unterstützen

    Support Contao

    Standard

    Ich habe das quick 'n dirty für eine Newsliste im Template an der Stelle wo die Headline erscheint so gemacht:

    PHP-Code:
    <?php
      $start 
    0;
      
    $laenge 40;
      
    $this->headline =  preg_replace("/[^ ]*$/"''substr($this->headline$start$laenge));
      echo 
    $this->headline;
    ?> …

  5. #5
    Contao-Nutzer
    Registriert seit
    19.06.2009.
    Beiträge
    177

    Standard

    Super, vielen Dank für Eure schnellen Antworten!!!

  6. #6
    Contao-Urgestein Avatar von Thomas
    Registriert seit
    16.08.2009.
    Ort
    Visselhövede
    Beiträge
    1.947
    User beschenken
    Wunschliste

    Standard

    Altes Thema, aber eine Frage dazu!

    Mit der genannten Funktion kürze ich Texte von Nachrichten, auf einer Startseite.
    Jetzt möchte ich aber die brühmten 3 Punkte (...) an den Text anhängen!?

    Zeilenumbrüche werden mit <p></p> formatiert. Ich bekomme es aber nicht hin, die Punkte zwischen Text und dem letzten Endtag zu bekommen.
    Gruß Thomas
    "Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du." Mahatma Gandhi

  7. #7
    Contao-Urgestein
    Registriert seit
    30.01.2011.
    Ort
    Stuttgart
    Beiträge
    4.138

    Standard

    Versuch das bitte mal so....
    PHP-Code:
    echo $this->headline."…"

  8. #8
    Contao-Urgestein Avatar von Thomas
    Registriert seit
    16.08.2009.
    Ort
    Visselhövede
    Beiträge
    1.947
    User beschenken
    Wunschliste

    Standard

    Ne, das kann nicht funktionieren, trotzdem Danke.

    Es geht auch nicht um die Headline sondern um $this-text aus dem Nachrichtenmodul.

    Hier wird die Ausgabe mit folgendem, ähnlichen Inhalt generiert:
    Code:
    <div class="ce_text block">
    <p>Irgend ein Text</p>
    <p>Irgend ein weiterer Absatz</p>
    </div>
    Jetzt gilt es zwischen dem letzten Wort und dem letzten p-tag die Punkte zu bekommen.
    Im Template ce_text kann ich mir den Inhalt auch nicht aufbereiten, da dieses Template ja im ganzen System Verwendung findet.

    Ich kürze also die Textausgabe innerhalb des Nachrichtenlesers, indem ich an der entsprechenden Stelle folgenden Code einfüge:
    Code:
    $this->import('String');
    
    $this->text = $this->String->substrHtml($this->text, 630); 
    echo $this->text;
    Mit str_replace() könnte man Strings filtern und abändern, dass funktioniert hier aber leider nicht.
    Vielleicht gibt es da ja noch eine andere Idee.
    Gruß Thomas
    "Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du." Mahatma Gandhi

  9. #9
    AG CMS-Garden
    Contao-Urgestein
    Avatar von lindesbs
    Registriert seit
    05.06.2009.
    Ort
    Oer-Erkenschwick
    Beiträge
    4.154
    Partner-ID
    keine
    User beschenken
    Wunschliste

    Standard

    Du moechtest also sowas :

    Code:
    <div class="ce_text block">
    <p>Irgend ein Text</p>
    <p>Irgend ein ...</p>
    </div>
    von Willi Voltz aus PR 500: Henry George sagte einmal: »Kultur ist Zusammenarbeit.«


    Contao-Hosting: begeisterter Uberspace-Nutzer

  10. #10
    Contao-Urgestein
    Registriert seit
    30.01.2011.
    Ort
    Stuttgart
    Beiträge
    4.138

    Standard

    dann so... String kürzen um </p> und dann wieder anhängen...
    PHP-Code:
    $this->text = (substr($this-text0, -4))." …</p>" 
    echo $this->text
    Geht halt schief wenn kein paragraph am Ende ist
    Geändert von magicsepp (06.12.2012 um 13:22 Uhr)

  11. #11
    Contao-Urgestein Avatar von Thomas
    Registriert seit
    16.08.2009.
    Ort
    Visselhövede
    Beiträge
    1.947
    User beschenken
    Wunschliste

    Standard

    Ja, lindesbs, genau!

    @magicsepp
    Das funktioniert auch nicht!
    Er hängt zwar die Punkte rein, boxt aber gleichzeitig sämtliche anderen Ausgaben raus. Übrig bleiben dann nur die Punkte.

    Ich habe das auch schon mit sowas hier probiert, da Contao ja die Funktion substrHtml() mitbringt:
    Code:
    $this->text = $this->String->substrHtml($this->text, 630, -4)).' …</p>';
    Gruß Thomas
    "Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du." Mahatma Gandhi

  12. #12
    AG CMS-Garden
    Contao-Urgestein
    Avatar von lindesbs
    Registriert seit
    05.06.2009.
    Ort
    Oer-Erkenschwick
    Beiträge
    4.154
    Partner-ID
    keine
    User beschenken
    Wunschliste

    Standard

    OK, dann weiss ich wenigstens, worum es geht.

    Woher kommen die <p> ?
    ich habe hier in der MA auch ein ce_text, was aber nur komplett mit <p> gekapselt ist.
    von Willi Voltz aus PR 500: Henry George sagte einmal: »Kultur ist Zusammenarbeit.«


    Contao-Hosting: begeisterter Uberspace-Nutzer

  13. #13
    Contao-Urgestein
    Registriert seit
    30.01.2011.
    Ort
    Stuttgart
    Beiträge
    4.138

    Standard

    Zitat Zitat von Thomas Beitrag anzeigen
    Ja, lindesbs, genau!

    @magicsepp
    Das funktioniert auch nicht!
    Er hängt zwar die Punkte rein, boxt aber gleichzeitig sämtliche anderen Ausgaben raus. Übrig bleiben dann nur die Punkte.

    Ich habe das auch schon mit sowas hier probiert, da Contao ja die Funktion substrHtml() mitbringt:
    Code:
    $this->text = $this->String->substrHtml($this->text, 630, -4)).' …</p>';
    ist schon klar das es so nicht geht ... wenn man alles nur zusammenwürfelt

    PHP-Code:
    $this->import('String');

    $this->text $this->String->substrHtml($this->text630);
    $this->text = (substr($this-text0, -4))." …</p>" ;

    echo 
    $this->text

  14. #14
    Contao-Urgestein Avatar von Thomas
    Registriert seit
    16.08.2009.
    Ort
    Visselhövede
    Beiträge
    1.947
    User beschenken
    Wunschliste

    Standard

    Nene, magicsepp, das hatte ich auch schon durch, geht nicht.

    @lindesbs
    Aus der Nachrichtenliste mit dem Template news_short.html5.
    Der Inhalt kommt über den tinyMCE und ce_text.html5 in das Template.
    In ce_text kommt es über tl_content rein.

    Die p-Tags stehen dabei schon in der Spalte text in tl_content.

    Achja, das Ganze ist unter 3.0.1.
    Gruß Thomas
    "Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du." Mahatma Gandhi

  15. #15
    AG CMS-Garden
    Contao-Urgestein
    Avatar von lindesbs
    Registriert seit
    05.06.2009.
    Ort
    Oer-Erkenschwick
    Beiträge
    4.154
    Partner-ID
    keine
    User beschenken
    Wunschliste

    Standard

    OK, dann kann ich es nachstellen.
    Sowas geht recht einfach, durch aufteilen der Texte und berechnen.
    von Willi Voltz aus PR 500: Henry George sagte einmal: »Kultur ist Zusammenarbeit.«


    Contao-Hosting: begeisterter Uberspace-Nutzer

  16. #16
    Contao-Urgestein Avatar von Thomas
    Registriert seit
    16.08.2009.
    Ort
    Visselhövede
    Beiträge
    1.947
    User beschenken
    Wunschliste

    Standard

    Wenn Du Zeit findest, kannst Du uns ja mal ein Stück schlauer machen.

    So eilig ist das jetzt nicht, nur ärgerlich wenn man nicht selber drauf kommt. Es wurmt einfach.
    Gruß Thomas
    "Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du." Mahatma Gandhi

  17. #17
    AG CMS-Garden
    Contao-Urgestein
    Avatar von lindesbs
    Registriert seit
    05.06.2009.
    Ort
    Oer-Erkenschwick
    Beiträge
    4.154
    Partner-ID
    keine
    User beschenken
    Wunschliste

    Standard

    Du musst nur die Variable $iMaxLength anpassen.
    Der zerstueckelt erstmal die Texte in die einzelnen <p> Bereiche, berechnet die Laenger der einzelnen Elemente OHNE HTML Codes und fuegt wieder alles zusammen.
    Beim letzten, also wenn deine MaxLength ueberschritten ist, kuerzt er und haengt nur noch die "..." dran.

    Fertig.

    PHP-Code:

    <?php 
    $strText 
    $this->text
    preg_match_all("|<p>(.*)</p>|U",$strText,$arrOutput);
    $iMaxLength=212;
    $iActualLength=0;

    foreach (
    $arrOutput[1] as $strOutput)
    {    
        
    $iTextLength strlen(strip_tags($strOutput));
        if ((
    $iActualLength+$iTextLength)>$iMaxLength)    
        {        
    // Hier muss nun gekuerzt werden                
            
    $this->import('String'); 
            
    $strOutput $this->String->substrHtml($strOutput,$iMaxLength-$iActualLength);
            echo 
    '<p>'.$strOutput.' ... </p>'// Und hier noch die Puenktchen hinten dran        
            
    break;    
        }    
        else
        {
            echo 
    '<p>'.$strOutput.'</p>';    
        }        
        
    $iActualLength+=$iTextLength;
    }
    ?>
    von Willi Voltz aus PR 500: Henry George sagte einmal: »Kultur ist Zusammenarbeit.«


    Contao-Hosting: begeisterter Uberspace-Nutzer

  18. #18
    Contao-Urgestein
    Registriert seit
    30.01.2011.
    Ort
    Stuttgart
    Beiträge
    4.138

    Standard

    Grrr... substr in Contao nutzt die Gelegenheit die html-Tags zu entfernen... (das vergesse ich doch immer wieder)
    dann sollt es so gehen...
    .... also machen wir es so dann geht es auch wie erwartet ..
    PHP-Code:
    <?php $this->import('String');
    $this->text = ($this->String->substrHtml(($this->text), 630)); 
    $this->text "<p>".utf8_substr($this->text0)."&hellip;</p>";?>  
    <?php echo $this->text?>
    Geändert von magicsepp (06.12.2012 um 15:08 Uhr)

  19. #19
    Contao-Urgestein Avatar von Thomas
    Registriert seit
    16.08.2009.
    Ort
    Visselhövede
    Beiträge
    1.947
    User beschenken
    Wunschliste

    Standard

    Zunächst mal Danke.

    Der obere Vorschlag funktioniert so wie gewollt.
    Naja, fast.
    Der Container <div class="ce_text...">...</div> wird gleich mit entfernt.
    Damit kann ich aber leben.

    Der 2. hat das Problem, dass er die Punkte und <p></p> an völlig falscher Stelle setzt und dieses Konstrukt bei raus kommt:
    Code:
    <div class="layout_short block first last even inlay">
    <p></p>
    <div class="ce_text block">
    <p>Dummy Text:</p>
    <p>Far far away, behind the word mountains, far from the countries Vokalia and Consonantia, there live the blind texts. Separated they live in Bookmarksgrove right at the coast of the Semantics, a large language ocean. A small river named Duden flows by their place and supplies it with the necessary regelialia. It is a paradisematic country, in which roasted parts of sentences fly into your mouth. Even the all-powerful Pointing has no control about the blind texts it is an almost unorthographic life One day however a small line of blind text by the name of Lorem Ipsum decided to leave for the far World of</p>
    </div>
    </div>
    …
    <p></p>
    Gruß Thomas
    "Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du." Mahatma Gandhi

  20. #20
    Contao-Urgestein
    Registriert seit
    30.01.2011.
    Ort
    Stuttgart
    Beiträge
    4.138

    Standard

    noch eine Möglichkeit wäre:
    PHP-Code:
    <?php $this->import('String');
    $this->text substr_replace($this->String->substrHtml($this->text630), "…", -40);
    echo 
    $this->text;?>
    Das geht allerdings nur wenn sicher ist das immer ein </p> am Ende ist ansonsten kommt sowas dabei rüber: "Beis…piel". Dann könnte man das ganze noch in eine weitere Abfrage verpacken, damit das gewährleistet ist.

  21. #21
    Contao-Urgestein Avatar von Thomas
    Registriert seit
    16.08.2009.
    Ort
    Visselhövede
    Beiträge
    1.947
    User beschenken
    Wunschliste

    Standard

    Das funktioniert in diesem Fall nicht!
    Das liegt daran, dass $this-text den gesamten DIV-Container von ce-text.html5 ausliefert.

    Die umfangreiche Lösung erscheint mir am geeignetsten, da hier ja nur die HTML-Tags entfernt und später die p-tags wieder eingesetzt werden.

    Flexibel ist das nicht.
    Wenn ich jetzt auf <br> Zeilenumbrüche umstellen würde, könnte das so nicht mehr funktionieren.

    Wie gesagt, ich kann damit leben.
    Schöner wäre natürlich ein Modul oder eine Funktion, welche uns ermöglichen jegliche Textinhalte verkürzt darzustellen, ohne auf die Eventualtitäten der Formatierungen Rücksicht nehmen zu müssen.
    Für 2.x gabe es da glaube ich auch mal etwas Ähnliches, allerdings nur für bestimmte Module.
    Geändert von Thomas (07.12.2012 um 10:06 Uhr)
    Gruß Thomas
    "Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du." Mahatma Gandhi

  22. #22
    Contao-Urgestein Avatar von Thomas
    Registriert seit
    16.08.2009.
    Ort
    Visselhövede
    Beiträge
    1.947
    User beschenken
    Wunschliste

    Standard

    Nachdem mich die Tatsache etwas störte, dass ich in Texten keine <br> verwenden dürfte, habe ich nach einer anderen Lösung gesucht.

    Hiermut sollte es möglich sein, alle Tags auch in Texten verwenden zu können:
    Code:
    if(strlen($this->text) < 500){
    echo $this->text;
    } else{
    $this->text = preg_replace('/^(.*?)\\0(.*)$/is', '$1', wordwrap( $this->text, 500, "\0" ));
    echo $this->text." ..."; // hier wird $this->text ausgegeben und die Punkte angehängt
    }
    Was passiert hier?
    Code:
    if(strlen($this->text) < 500)
    Zählt die Anzahl der Zeichen im String und leitet bei einer Anzahl größer 499 Zeichen das Kürzen des Strings ein. Wenn die Anzahl kleiner 500 Zeichen wird der String direkt ausgegeben.
    Code:
    wordwrap( $this->text, 500, "\0" )
    Sorgt dafür, dass alle 500 Zeichen (anpassbar) ein ASCII-Code für die Zahl 0 eingefügt wird. Die 0 gibt es als ASCII nicht, wir können es hier aber prima als Seperator verwenden und ausnutzen.
    Wordwrap sorgt zudem dafür, dass das ASCII-Zeichen am Ende eines ganzen Wortes eingefügt wird. Es kann als auch sein, dass das erst nach 512 Zeichen passiert, je nach Länge des Wortes.
    Code:
    preg_replace('/^(.*?)\\0(.*)$/is', '$1',
    Sucht mit einem regulären Ausdruck nach dem ASCII-Zeichen und teilt den Text in einzelne Abschnitte ein (z.B. 1. Teil = $1 : 2. Teil = $2 usw.). Uns interessiert aber nur der Teil vor dem ersten ASCII-Zeichen, daher sprechen wir diesen Teil mit $1 an und schreiben ihn zurück in den String ($this->text).

    Auf die Definition des regulären Ausdruckes gehe ich nicht weiter ein, dafür gibt genügend Lesestoff im Netz.

    Für $this->text kann natürlich jeder x-beliebige String definiert werden, ergo ist es auch in anderen Modulen (Templates) einfach zu verwenden.
    Gruß Thomas
    "Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du." Mahatma Gandhi

  23. #23
    Contao-Fan
    Registriert seit
    12.11.2009.
    Ort
    Portugal
    Beiträge
    619

    Standard

    hab ninas code im news-template eingebaut und für den teaser
    Code:
    <?php 
      $start = 0; 
      $laenge = 200; 
      $this->headline =  preg_replace("/[^ ]*$/", '', substr($this->teaser, $start, $laenge)); 
      echo $this->headline; 
    ?> …

    Das Problem ist dass wenn ein <strong> aufgeht und innerhalb der 200 Zeichen nicht mehr zugeht. dass die restliche Seite strong gemacht wird.
    Wie kann ich das ändern?

    Danke

    hab jetzt mal folgendes eingesetzt, ist keine schöne Variante, aber funktioniert.
    Code:
    echo $this->headline."</strong>";
    Geändert von karo (01.10.2015 um 22:18 Uhr)

  24. #24
    Contao-Urgestein Avatar von Andreas
    Registriert seit
    19.06.2009.
    Ort
    Mönchengladbach
    Beiträge
    7.703
    User beschenken
    Wunschliste
    Contao-Projekt unterstützen

    Support Contao

    Standard

    Versucht die Contao-Methoden zu benutzen.

    Mit Tags:
    PHP-Code:
    $this->headline = \StringUtil::substrHtml($this->headline40); 
    https://github.com/contao/core/blob/...gUtil.php#L101

    Oder ohne Tags:
    PHP-Code:
    $this->headline = \StringUtil::substr($this->headline40'&nbsp;…'); 
    https://github.com/contao/core/blob/...ngUtil.php#L40
    Bitte!
    Vor Anfragen im Forum HTML validieren.
    Codesnippets hier im Froum sauber einrücken. Nur Tabs o. nur Leerzeichen verwenden.

    Vielen Dank an alle Wunschlistenerfüller
    Andreas Burg, Web Solutions

  25. #25
    Contao-Nutzer Avatar von a-v-l
    Registriert seit
    20.09.2013.
    Ort
    Freiburg im Breisgau
    Beiträge
    88

    Standard

    Ich habe das Problem, wie von Andreas nahegelegt, mit Bordmitteln und einer Regex gelöst. Bei mir kam allerdings verschärfend hinzu, dass der zu kürzende Text aus großer Überschrift und kleinerem Fließtext besteht – es sollten Nachrichten dargestellt werden, ohne manuell einen Teaser angeben zu müssen. Auch das kein Problem:

    PHP-Code:
      // Auszug aus dem angepassten news_template.html5
      <h3><?= $this->newsHeadline ?></h3>

      <?php
      
    if ($this->hasText) {

        
    // Maximale Zeichenlänge
        
    $max_length 700;

        
    // Größenverhältnis zwischen Headline und Fließtext.
        // Das muss natürlich je nach Gestaltung angepasst werden…
        
    $headline_size 1.5;

        
    // Maximale Zeichenlänge wird um Headlinelänge mal Großenfaktor reduziert
        
    $max_length $max_length - (strlen($this->newsHeadline) * $headline_size);

        
    // Text wird mit Bordmitteln gekürzt
        
    $subText = \StringUtil::substrHtml($this->text$max_length);

        
    // Die drei Punkte sollen nur angefügt werden, wenn der Text tatsächlich gekürzt wurde.
        // Dazu prüfe ich, ob $subText kürzer ist als der Originaltext (ungefähr)
        
    $subCheck = \StringUtil::substrHtml($this->text$max_length 25);
        if(
    strlen($subCheck) > strlen($subText)) {

          
    // Ist der Text gekürzt worden, füge ich vor dem innersten schließenden Tag
          // die Auslassungspunkte ein
          
    $subText preg_replace("/(<\/[^\s]*>)$/""…$1"$subText);
          echo 
    $subText;
        } else {

          
    // Ist der Text nicht gekürzt worden, gebe ich den Originaltext aus
          
    echo $this->text;
        }
      }
      
    ?>
    Ich hoffe, der ein oder die andere kann was damit anfangen…

Aktive Benutzer

Aktive Benutzer

Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)

Ähnliche Themen

  1. viele Anfängerfragen - ua. Datenübertragung kürzen
    Von AntiSpeed im Forum Sonstiges zu Contao
    Antworten: 9
    Letzter Beitrag: 05.02.2011, 13:35
  2. Eine bestimmte Zeichenkette überschreiben
    Von dArignac im Forum Mehrsprachigkeit
    Antworten: 2
    Letzter Beitrag: 07.08.2010, 14:03
  3. Zeichenlänge kürzen
    Von TWA_DarkSun im Forum Nachrichten/Events/FAQ
    Antworten: 0
    Letzter Beitrag: 08.11.2009, 12:08

Lesezeichen

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •