Wie schneide ich eine Zeichenfolge in PHP auf das Wort ab, das einer bestimmten Anzahl von Zeichen am nächsten kommt?

Lesezeit: 5 Minuten

Ich habe ein in PHP geschriebenes Code-Snippet, das einen Textblock aus einer Datenbank zieht und an ein Widget auf einer Webseite sendet. Der ursprüngliche Textblock kann ein langer Artikel oder ein oder zwei kurze Sätze sein; aber für dieses Widget kann ich nicht mehr als beispielsweise 200 Zeichen anzeigen. Ich könnte substr() verwenden, um den Text bei 200 Zeichen abzuschneiden, aber das Ergebnis wäre ein Abschneiden in der Mitte der Wörter – was ich wirklich möchte, ist, den Text am Ende des letzten abzuschneiden Wort vor 200 Zeichen

  • Die Frage soll sagen, dass der abgeschnittene Text in eine feste Anzahl von Pixeln auf einer Webseite passt. In diesem Fall ist der Platzbedarf pro Zeichen je nach gewählter Schriftart nicht konstant. Und daher können wir nicht davon ausgehen, dass 200 Zeichen am besten in verfügbare Pixel passen. Bisher (bis 02. März 2011) fehlt dieser Punkt bei allen untenstehenden Antworten, und daher bietet keine von ihnen eine zuverlässige Lösung. -:(

    – Löwenherz

    2. März 2011 um 9:02 Uhr

  • Nein, nicht wirklich. Sie können die Schriftart auf zuverlässige Weise festlegen und dann das Worst-Case-Szenario messen, d. h. wie viele der breitesten Zeichen passen würden. Und wenn Sie 100% sicher sein müssen, wie der Browser es gerendert hat, ist es sowieso kein PHP-Problem mehr.

    – Molot

    29. August 2013 um 11:59 Uhr

  • Probieren Sie diesen Link aus, der Ihnen möglicherweise helfen kann stackoverflow.com/a/26098951/3944217

    – Edwin Thomas

    29. September 2014 um 11:38 Uhr

  • Sie könnten finden s($str)->truncateSafely(200) hilfreich, wie in gefunden diese eigenständige Bibliothek.

    – kräh

    27. Juli 2016 um 0:02 Uhr

Dadurch werden die ersten 200 Zeichen der Wörter zurückgegeben:

preg_replace('/\s+?(\S+)?$/', '', substr($string, 0, 201));

  • Schon fast. Es scheint, als würde es das letzte Wort des Satzes für mich entfernen, egal was passiert.

    – ReX357

    4. August 2011 um 19:19 Uhr

  • funktioniert super, aber ich habe den gleichen Fehler wie ReX357 gefunden. Wenn mehr als 1 Wort vorhanden ist, wird das letzte gelöscht.

    – Andrés SK

    26. November 2011 um 16:09 Uhr

  • Wickeln Sie es einfach in eine Prüfung ein, um sicherzustellen, dass die Zeichenfolge länger ist als das, worauf Sie testen (wie die akzeptierte Antwort). if (strlen($string) > $your_desired_width) { preg_replace(...); }

    – Blair McMillan

    18. April 2012 um 5:49 Uhr

  • Ich habe die Antwort so bearbeitet, dass sie Ratschläge von @BlairMcMillan enthält

    – Kim Stacks

    26. März 2014 um 6:46 Uhr

  • Winzige Verbesserung der Regex: Die Klammern machen das abschließende \S+ optional für die Übereinstimmung, aber sie erfassen auch diese Zeichen. Da wir diese Zeichen nicht erfassen müssen, machen Sie die Klammern so, dass sie nicht erfasst werden: /\s+?(?:\S+)?$/

    – PCronin

    18. November 2015 um 15:28 Uhr


  • Wenn die Länge der angegebenen Zeichenfolge kleiner als die maximale Länge ist, würde dies alles bis zum letzten Leerzeichen abschneiden. Um dies zu vermeiden, wickeln Sie dies in ein ein if Aussage: if (strlen($str) > 200) { ... }

    – Amal Murali

    8. Mai 2014 um 15:36 Uhr

  • Einfach und wahrscheinlich viel schneller als andere Lösungen.

    – Wladan

    4. Mai 2015 um 13:06 Uhr

  • Ein Problem dabei ist, dass eine leere Zeichenfolge zurückgegeben wird, wenn die Zeichenfolge kein Leerzeichen enthält.

    – bestell

    1. September 2015 um 21:00 Uhr

  • Kann vereinfacht werden zu: $WidgetText = substr($string, 0, strpos($string, ' ', 200));

    – wranvaud

    25. April 2019 um 8:15 Uhr

Wie schneide ich eine Zeichenfolge in PHP auf das Wort
Sergij Sokolenko

Die folgende Lösung wurde geboren, als ich einen $break-Parameter von bemerkt habe Zeilenumbruch Funktion:

Zeichenfolge Zeilenumbruch ( Zeichenfolge $str [, int $width = 75 [, string $break =
“\n” [, bool $cut = false ]]])

Hier ist die Lösung:

/**
 * Truncates the given string at the specified length.
 *
 * @param string $str The input string.
 * @param int $width The number of chars at which the string will be truncated.
 * @return string
 */
function truncate($str, $width) {
    return strtok(wordwrap($str, $width, "...\n"), "\n");
}

Beispiel 1.

print truncate("This is very long string with many chars.", 25);

Das obige Beispiel wird ausgegeben:

This is very long string...

Beispiel #2.

print truncate("This is short string.", 25);

Das obige Beispiel wird ausgegeben:

This is short string.

  • dies funktioniert nicht, wenn die Zeichenfolge bereits ein Zeilenumbruchzeichen enthält (z. B. wenn Sie versuchen, a description eines Blogbeitrags)

    – supersan

    8. Juni 2015 um 11:38 Uhr


  • @supersan Kann immer mit vorverarbeiten preg_replace('/\s+/', ' ', $description) um alle Leerzeichen durch ein einzelnes Leerzeichen zu ersetzen 😉

    – Mavelo

    11. Mai 2018 um 17:40 Uhr

Denken Sie immer daran, wenn Sie irgendwo nach “Worten” trennen, dass einige Sprachen wie Chinesisch und Japanisch kein Leerzeichen verwenden, um Wörter zu trennen. Außerdem könnte ein böswilliger Benutzer einfach Text ohne Leerzeichen eingeben oder einen Unicode-Look-Alike zum Standard-Leerzeichen verwenden. In diesem Fall könnte jede von Ihnen verwendete Lösung sowieso den gesamten Text anzeigen. Eine Möglichkeit, dies zu umgehen, besteht darin, die Zeichenfolgenlänge zu überprüfen, nachdem sie wie üblich in Leerzeichen aufgeteilt wurde. Wenn die Zeichenfolge dann immer noch über einer anormalen Grenze liegt – in diesem Fall möglicherweise 225 Zeichen -, gehen Sie vor und teilen Sie sie dumm an dieser Grenze.

Noch eine Einschränkung bei solchen Dingen, wenn es um Nicht-ASCII-Zeichen geht; Zeichenfolgen, die sie enthalten, können von PHPs Standard strlen() als länger interpretiert werden, als sie wirklich sind, da ein einzelnes Zeichen zwei oder mehr Bytes statt nur eines benötigen kann. Wenn Sie nur die Funktionen strlen()/substr() verwenden, um Zeichenketten zu teilen, können Sie eine Zeichenkette mitten in einem Zeichen teilen! Im Zweifel, mb_strlen()/mb_substr() sind etwas idiotensicherer.

  • dies funktioniert nicht, wenn die Zeichenfolge bereits ein Zeilenumbruchzeichen enthält (z. B. wenn Sie versuchen, a description eines Blogbeitrags)

    – supersan

    8. Juni 2015 um 11:38 Uhr


  • @supersan Kann immer mit vorverarbeiten preg_replace('/\s+/', ' ', $description) um alle Leerzeichen durch ein einzelnes Leerzeichen zu ersetzen 😉

    – Mavelo

    11. Mai 2018 um 17:40 Uhr

1646885647 942 Wie schneide ich eine Zeichenfolge in PHP auf das Wort
lajlev

Verwenden Sie strpos und substr:

<?php

$longString = "I have a code snippet written in PHP that pulls a block of text.";
$truncated = substr($longString,0,strpos($longString,' ',30));

echo $truncated;

Dadurch erhalten Sie eine Zeichenfolge, die am ersten Leerzeichen nach 30 Zeichen abgeschnitten wird.

  • Hallo, wenn die Zeichenfolgenlänge ohne Leerzeichen kleiner als 30 ist, wird es einen Rückgabefehler geben. und hier wird das Ergebnis aus den ersten 31 Zeichen bestehen, nicht aus 30.

    – Ähm. Anurag Jain

    3. November 2012 um 5:05 Uhr

986100cookie-checkWie schneide ich eine Zeichenfolge in PHP auf das Wort ab, das einer bestimmten Anzahl von Zeichen am nächsten kommt?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy