Ich habe ein in PHP geschriebenes Code-Snippet, das einen Textblock aus einer Datenbank abruft und an ein Widget auf einer Webseite sendet. Der ursprüngliche Textblock kann ein langer Artikel oder ein oder zwei kurze Sätze sein. Für dieses Widget kann ich jedoch nicht mehr als beispielsweise 200 Zeichen anzeigen. Ich könnte substr () verwenden, um den Text mit 200 Zeichen abzuschneiden, aber das Ergebnis wäre, mitten in Wörtern abzuschneiden - was ich wirklich möchte, ist, den Text am Ende des letzten Wortes vor 200 Zeichen abzuschneiden.
183
s($str)->truncateSafely(200)
hilfreiche Informationen in dieser eigenständigen Bibliothek .Antworten:
Mit der Wordwrap- Funktion. Die Texte werden in mehrere Zeilen aufgeteilt, sodass die von Ihnen angegebene maximale Breite an den Wortgrenzen unterbrochen wird. Nach dem Teilen nehmen Sie einfach die erste Zeile:
Eine Sache, die dieser Oneliner nicht behandelt, ist der Fall, wenn der Text selbst kürzer als die gewünschte Breite ist. Um diesen Randfall zu behandeln, sollte man etwas tun wie:
Die obige Lösung hat das Problem, den Text vorzeitig zu schneiden, wenn er vor dem eigentlichen Schnittpunkt eine neue Zeile enthält. Hier eine Version, die dieses Problem löst:
Hier ist auch die PHPUnit-Testklasse, die zum Testen der Implementierung verwendet wird:
EDIT:
Spezielle UTF8-Zeichen wie 'à' werden nicht behandelt. Fügen Sie 'u' am Ende des REGEX hinzu, um damit umzugehen:
$parts = preg_split('/([\s\n\r]+)/u', $string, null, PREG_SPLIT_DELIM_CAPTURE);
quelle
\n
vor der gewünschten Breite ein Text steht .Arabic
Buchstaben und es wurde jetzt mit Hilfe dertokenTruncate
Funktion auf korrekte Wörter reduziert . tnx eine Million :)Dies gibt die ersten 200 Zeichen von Wörtern zurück:
quelle
if (strlen($string) > $your_desired_width) { preg_replace(...); }
/\s+?(?:\S+)?$/
Und da haben Sie es - eine zuverlässige Methode, um eine Zeichenfolge auf das nächste ganze Wort zu kürzen und dabei die maximale Zeichenfolgenlänge zu unterschreiten.
Ich habe die anderen Beispiele oben ausprobiert und sie haben nicht die gewünschten Ergebnisse erzielt.
quelle
if
Erklärung ein:if (strlen($str) > 200) { ... }
$WidgetText = substr($string, 0, strpos($string, ' ', 200));
Die folgende Lösung wurde geboren, als ich einen $ break-Parameter der Wordwrap- Funktion bemerkte :
Hier ist die Lösung :
Beispiel 1.
Das obige Beispiel gibt Folgendes aus:
Beispiel 2.
Das obige Beispiel gibt Folgendes aus:
quelle
description
preg_replace('/\s+/', ' ', $description)
, um alle Leerzeichen durch ein einzelnes Leerzeichen zu ersetzen;)Denken Sie daran, wann immer Sie irgendwo nach "Wörtern" teilen, dass einige Sprachen wie Chinesisch und Japanisch kein Leerzeichen zum Teilen von Wörtern verwenden. Außerdem kann ein böswilliger Benutzer einfach Text ohne Leerzeichen eingeben oder Unicode verwenden, das dem Standard-Leerzeichen ähnelt. In diesem Fall wird bei jeder von Ihnen verwendeten Lösung möglicherweise trotzdem der gesamte Text angezeigt. Eine Möglichkeit, dies zu umgehen, besteht darin, die Zeichenfolgenlänge zu überprüfen, nachdem sie wie gewohnt auf Leerzeichen aufgeteilt wurde. Wenn die Zeichenfolge immer noch über einem abnormalen Grenzwert liegt - in diesem Fall möglicherweise 225 Zeichen -, wird sie an diesem Grenzwert dumm aufgeteilt.
Noch eine Einschränkung bei solchen Dingen, wenn es um Nicht-ASCII-Zeichen geht. Strings, die sie enthalten, können von PHPs Standard strlen () als länger interpretiert werden, als sie tatsächlich sind, da ein einzelnes Zeichen zwei oder mehr Bytes anstelle von nur einem benötigen kann. Wenn Sie nur die Funktionen strlen () / substr () verwenden, um Zeichenfolgen zu teilen, können Sie eine Zeichenfolge in der Mitte eines Zeichens teilen! Im Zweifelsfall sind mb_strlen () / mb_substr () etwas narrensicherer.
quelle
Verwenden Sie strpos und substr:
Dadurch erhalten Sie eine Zeichenfolge, die nach 30 Zeichen am ersten Leerzeichen abgeschnitten wird.
quelle
Bitte schön:
quelle
Hier ist meine Funktion basierend auf dem Ansatz von @ Cd-MaN.
quelle
Beschreibung:
^
- Beginnen Sie am Anfang der Zeichenfolge([\s\S]{1,200})
- Holen Sie sich von 1 bis 200 eines beliebigen Charakters[\s]+?
- Fügen Sie keine Leerzeichen am Ende des Kurztextes ein, damit wirword ...
stattdessen vermeiden könnenword...
[\s\S]+
- Alle anderen Inhalte abgleichenTests:
regex101.com
Lassen Sie uns zuor
einigen anderen hinzufügenr
regex101.com
orrrr
genau 200 Zeichen.regex101.com
nach dem fünftenr
orrrrr
ausgeschlossen.Genießen.
quelle
$1
ein "Ersatz" ist, aber in diesem speziellen Kontext, worauf bezieht es sich? eine leere Variable?$1
Referenzierung, um in Klammern übereinzustimmen([\s\S]{1,200})
.$2
verweist auf zwei zweite Klammerpaare, falls vorhanden.Es ist überraschend, wie schwierig es ist, die perfekte Lösung für dieses Problem zu finden. Ich habe auf dieser Seite noch keine Antwort gefunden, die zumindest in einigen Situationen nicht fehlschlägt (insbesondere wenn die Zeichenfolge Zeilenumbrüche oder Tabulatoren enthält oder wenn der Wortumbruch etwas anderes als ein Leerzeichen ist oder wenn die Zeichenfolge UTF- enthält. 8 Multibyte-Zeichen).
Hier ist eine einfache Lösung, die in allen Fällen funktioniert. Hier gab es ähnliche Antworten, aber der Modifikator "s" ist wichtig, wenn Sie möchten, dass er mit mehrzeiligen Eingaben funktioniert, und der Modifikator "u" bewirkt, dass UTF-8-Multibyte-Zeichen korrekt ausgewertet werden.
Ein möglicher Randfall dabei ... Wenn die Zeichenfolge in den ersten $ characterCount-Zeichen überhaupt kein Leerzeichen enthält, wird die gesamte Zeichenfolge zurückgegeben. Wenn Sie es vorziehen, erzwingt eine Unterbrechung bei $ characterCount, auch wenn es sich nicht um eine Wortgrenze handelt, können Sie Folgendes verwenden:
Eine letzte Option, wenn Sie möchten, dass Ellipsen hinzugefügt werden, wenn die Zeichenfolge abgeschnitten wird ...
quelle
Ich würde die Funktion preg_match verwenden, um dies zu tun, da Sie einen ziemlich einfachen Ausdruck wünschen.
Der Ausdruck bedeutet "Passen Sie alle Teilzeichenfolgen an, die am Anfang der Länge 1-200 beginnen und mit einem Leerzeichen enden." Das Ergebnis ist in $ Ergebnis und die Übereinstimmung ist in $ Übereinstimmungen. Das kümmert sich um Ihre ursprüngliche Frage, die speziell auf jedem Platz endet. Wenn Sie möchten, dass es in Zeilenumbrüchen endet, ändern Sie den regulären Ausdruck in:
quelle
Ok, also habe ich eine andere Version davon basierend auf den obigen Antworten bekommen, aber mehr Dinge berücksichtigt (utf-8, \ n und & nbsp;), auch eine Zeile, die die WordPress-Shortcodes entfernt, die kommentiert werden, wenn sie mit wp verwendet werden.
quelle
Dies ist eine kleine Lösung für die Antwort von mattmac:
Der einzige Unterschied besteht darin, am Ende von $ string ein Leerzeichen einzufügen. Dies stellt sicher, dass das letzte Wort nicht gemäß dem Kommentar von ReX357 abgeschnitten wird.
Ich habe nicht genügend Wiederholungspunkte, um dies als Kommentar hinzuzufügen.
quelle
Verwendung:
Dies gibt die ersten 10 Wörter aus.
Das
preg_split
Funktion wird verwendet, um einen String in Teilzeichenfolgen aufzuteilen. Die Grenzen, entlang derer die Zeichenfolge geteilt werden soll, werden mithilfe eines Musters mit regulären Ausdrücken angegeben.preg_split
Die Funktion benötigt 4 Parameter, aber momentan sind nur die ersten 3 für uns relevant.Erster Parameter - Muster Der erste Parameter ist das Muster für reguläre Ausdrücke, entlang dessen die Zeichenfolge aufgeteilt werden soll. In unserem Fall möchten wir die Zeichenfolge über Wortgrenzen hinweg aufteilen. Daher verwenden wir eine vordefinierte Zeichenklasse
\s
die Leerzeichen wie Leerzeichen, Tabulatoren, Wagenrücklauf und Zeilenvorschub entspricht.Zweiter Parameter - Eingabezeichenfolge Der zweite Parameter ist die Langtextzeichenfolge, die wir teilen möchten.
Dritter Parameter - Limit Der dritte Parameter gibt die Anzahl der Teilzeichenfolgen an, die zurückgegeben werden sollen. Wenn Sie das Limit auf setzen
n
, gibt preg_split ein Array von n Elementen zurück. Die erstenn-1
Elemente enthalten die Teilzeichenfolgen. Das letzte(n th)
Element enthält den Rest der Zeichenfolge.quelle
Basierend auf @Justin Polieys Regex:
quelle
Ich habe eine Funktion, die fast das macht, was Sie wollen. Wenn Sie ein paar Änderungen vornehmen, passt sie genau:
quelle
So habe ich es gemacht:
quelle
Ich weiß, das ist alt, aber ...
quelle
Ich erstelle eine Funktion, die substr ähnlicher ist, und verwende die Idee von @Dave.
Ps.: Der Schnitt in voller Länge kann kleiner als der Teil sein.
quelle
Dem Code von Dave und AmalMurali wurden IF / ELSEIF-Anweisungen hinzugefügt, um Zeichenfolgen ohne Leerzeichen zu behandeln
quelle
Ich finde das funktioniert:
Funktion abbreviate_string_to_whole_word ($ string, $ max_length, $ buffer) {
}}
Mit dem Puffer können Sie die Länge der zurückgegebenen Zeichenfolge anpassen.
quelle
Benutze das:
Der folgende Code entfernt ','. Wenn Sie ein anderes Zeichen oder eine andere Unterzeichenfolge haben, können Sie diese anstelle von ',' verwenden.
// wenn Sie ein anderes Zeichenfolgenkonto für haben
quelle
Obwohl dies eine ziemlich alte Frage ist, dachte ich, ich würde eine Alternative anbieten, da sie für PHP 4.3+ nicht erwähnt und gültig war.
Sie können die
sprintf
Funktionsfamilie verwenden, um Text mithilfe des%.ℕs
Genauigkeitsmodifikators abzuschneiden.Einfache Kürzung https://3v4l.org/QJDJU
Ergebnis
Erweiterte Kürzung https://3v4l.org/FCD21
Da
sprintf
funktioniert ähnlichsubstr
und schneidet Wörter teilweise ab. Der folgende Ansatz stellt sicher, dass Wörter nicht durch Verwendungstrpos(wordwrap(..., '[break]'), '[break]')
eines speziellen Trennzeichens abgeschnitten werden. Dies ermöglicht es uns, die Position abzurufen und sicherzustellen, dass wir nicht mit Standard-Satzstrukturen übereinstimmen.Rückgabe einer Zeichenfolge ohne teilweises Abschneiden von Wörtern, die die angegebene Breite nicht überschreitet, wobei bei Bedarf Zeilenumbrüche beibehalten werden.
Ergebnis
Ergebnisse mit
wordwrap($string, $width)
oderstrtok(wordwrap($string, $width), "\n")
quelle
Ich habe das schon mal benutzt
quelle
Hier können Sie dies versuchen
quelle
Ich glaube, das ist der einfachste Weg:
Ich benutze die Sonderzeichen, um den Text zu teilen und zu schneiden.
quelle
Vielleicht hilft das jemandem:
quelle