Achot: strlen & substr

Hallo,

ich kurze bei der Ausgabe einen Text, sollte dieser zu lange sein. Dieses mache ich so

<?php if (strlen($array['titel']) >= $zeichen) {?>
<?php echo htmlspecialchars(substr($array['titel'],0, $zeichen) . "..."); } else { ?>
<?php echo htmlspecialchars($array['titel']); ?>
<?php } ?>

Meine Frage passt das so? Das if else benötige ich um die ... zu entfernen, sollten die Zeichen ausreichen. Kann man dieses auch anderes machen?

akzeptierte Antworten

  1. Hallo Achot,

    Kann man dieses auch anderes machen?

    https://wiki.selfhtml.org/wiki/Text-overflow

    Bis demnächst
    Matthias

    --
    Dieses Forum nutzt Markdown. Im Wiki erhalten Sie Hilfe bei der Formatierung Ihrer Beiträge.
    1. Hallo,

      https://wiki.selfhtml.org/wiki/Text-overflow

      danke für den Tipp mit dem CSS. Allerdings ist dieses keine gute Lösung, da der vollständig Text weiterhin im Klartext im Quelltext zu lesen ist? Dadurch wird viel zu viel Text geladen der an dieser Stelle nicht benötigt wird.

      1. @@Achot

        https://wiki.selfhtml.org/wiki/Text-overflow

        danke für den Tipp mit dem CSS. Allerdings ist dieses keine gute Lösung,

        Doch, das ist es. Warum das serverseitige Abschneiden keine gute Lösung ist, hab ich vor einiger Zeit schon mal aufgeschrieben.

        Dadurch wird viel zu viel Text geladen der an dieser Stelle nicht benötigt wird.

        Ein paar Byte Text sollten nicht das Problem sein.

        Du kannst aber beides machen: serverseitig auf eine nicht zu kleine Länge vorkürzen und clientseitig text-overflow einsetzen.

        LLAP 🖖

        --
        “When UX doesn’t consider all users, shouldn’t it be known as ‘Some User Experience’ or... SUX? #a11y” —Billy Gregory
        1. @@Achot

          https://wiki.selfhtml.org/wiki/Text-overflow

          danke für den Tipp mit dem CSS. Allerdings ist dieses keine gute Lösung,

          Doch, das ist es. Warum das serverseitige Abschneiden keine gute Lösung ist, hab ich vor einiger Zeit schon mal aufgeschrieben.

          Sehr gut!

  2. Tach!

    Meine Frage passt das so?

    Solange du nicht mit UTF-8 arbeitest, dann passt das so, wenn dein Ergebnis den Erwartungen entspricht.

    dedlfix.

    1. Hallo,

      Solange du nicht mit UTF-8 arbeitest, dann passt das so, wenn dein Ergebnis den Erwartungen entspricht.

      danke

  3. Da sich eine solche Aufgabe typischerweise wiederholt, und es immer gut ist, unterschiedliche Abstraktionsebenen der Programmlogik nicht in einen Klumpatsch zu vermengen, würde ich es eher so machen:

    <?= htmlspecialchars(truncate_string_with_ellipsis($array['titel'], $zeichen)) ?>
    

    und an anderer Stelle, wo Du deine Toolbox-Funktionen sammelst, dann

    function truncate_string_with_ellipsis($longString, $maxLength)
    {
       if (\strlen($longString) <= $maxLength)     // Länge nicht überschritten?
          return $longString;                      // --> Nichts tun
    
       return \substr($longString, 0, $maxLength-3) . '...';
    }
    

    Dazu folgende Anmerkungen:

    • Auslagern von Code in Funktionen bewirkt eine automatische Verbesserung der Lesbarkeit, wenn die Namen gut gewählt sind. Ob mein Name gut ist, weiß ich nicht recht, sicherlich gibt es auch andere Möglichkeiten, aber es ist auf jeden Fall so, dass der Leser des ersten Teils sich denken kann, dass hier der Titel abgeschnitten wird und eine Ellipse - "..." - angehängt wird. Normalerweise interessiert es den Leser der UI-Ebene nicht, wie genau das passiert. Es ist nur wichtig, DASS es passiert. Und wer das WIE doch wissen will, guckt eben in die Funktion. Wenn die Logik direkt in der UI-Ebene ist, muss man sie ständig mit lesen.
    • PHP Standardfunktionen präfixe ich immer mit einem , das ermöglich es mir, meinen eigenen Code in Namespaces aufzuteilen. Wenn Du keine Namespaces nutzt, kannst Du den Backslash auch weglassen.
    • Wenn der String zu lang ist, solltest Du ihn um 3 Zeichen mehr kürzen als die maximale Länge angibt, sonst ist er nach Anhängen des ... um bis zu 2 Zeichen zu lang. Das kann den von Dir gewünschten Effekt ruinieren
    • Auslagern in eine Funktion hat einen weiteren Vorteil, falls Du auf Unicode (UTF-8 Encoding) umstellst. Du kannst dann nicht mehr substr und strlen verwenden, sondern musst die mbstring Funktionen nutzen. Und wenn die Standard-String Funktionen nicht kreuz und quer verteilt sind, spart das Umstellarbeit. (Na gut, mbstring.func_overload=2 in der php.ini geht auch, aber manche sehen das als "kinda evil and gives you lots of headache"...)
    • Im Übrigen würde auch ich dazu raten, den String nur grob vorzukürzen (z.B. auf eine Länge von 2*$zeichen) und den Rest mit CSS zu machen. Ein exaktes Kürzen auf eine bestimmte Anzahl von Zeichen funktioniert im Zusammenhang mit proportionalen Schriften schlecht. CSS berücksichtigt die Zeichenbreiten und kürzt entsprechend.

    Rolf