Holen Sie sich die ersten n Zeichen einer Zeichenfolge
320
Wie kann ich die ersten n Zeichen eines Strings in PHP erhalten? Was ist der schnellste Weg, um eine Zeichenfolge auf eine bestimmte Anzahl von Zeichen zu kürzen und bei Bedarf '...' anzuhängen?
Es ist schon eine Weile her, dass ich diese Antwort geschrieben habe und ich benutze diesen Code nicht mehr. Ich bevorzuge diese Funktion, die verhindert, dass die Zeichenfolge in der Mitte eines Wortes mit der wordwrapFunktion unterbrochen wird :
Vielleicht ist es am besten, sie durch Auslassungspunkte (…) anstatt durch 3 Punkte (...) zu ersetzen
Keet,
3
Ich liebe das, aber ich habe es geändert und folgendes verwendet, um Leerzeichen am Ende zu entfernen: $ string = substr (trim ($ string), 0,10) .'... '; Auf diese Weise erhalten Sie etwas wie "Ich mag ..." anstelle von "Ich mag ...".
Kenton de Jong
28
"hellip" - ich brauchte einige Zeit, um zu verstehen, dass wir nicht über Satans IP-Adresse sprachen
Lucas Bernardo de Sousa
2
Update 3 ist am hilfreichsten.
Milkovsky
Sollte die Zeile 5 von Update 3 nicht eine feste Obergrenze für die Länge der zurückgegebenen Zeichenfolge sein $string = wordwrap($string, $length - sizeof($append)); ?
Michael Crenshaw
114
Diese Funktionalität ist seit Version 4.0.6 in PHP integriert. Siehe die Dokumente .
Hat perfekt für mich funktioniert. Die Top-Antwort hat nicht funktioniert, und ich bin froh, dass es nicht funktioniert hat, weil ich weiter gescrollt und dieses Juwel gefunden habe.
Eduardo
Vielen Dank, ich habe immer diese längere und ältere Methode verwendet!
gr3g
1
Dan, vielleicht möchten Sie etwas genauer wissen, welcher Teil der Top-Antwort für Sie nicht funktioniert hat. Die Funktion truncate () hat bei mir perfekt funktioniert und der Vorteil dieser Antwort gegenüber Bruchowskis Antwort ist, dass sie an Wortgrenzen bricht. Angenommen, Sie interessieren sich für so etwas.
pdwalker
2
guter Fang! Viele erfahrene PHP-Entwickler kennen diese Funktion nicht :)
jroi_web
1
Die Top-Antwort (im Moment ) ( stackoverflow.com/a/3161830/236306 ) hat nichts bewirkt (als hätte ich das fn überhaupt nicht verwendet). Ich weiß nicht warum. Diese Antwort scheint jedoch perfekt zu sein und brachte den zusätzlichen Vorteil der Arbeit mit sich.
Alan
15
Die Multibyte-Erweiterung kann nützlich sein, wenn Sie die Kontrolle über den Zeichenfolgenzeichensatz benötigen.
$charset ='UTF-8';
$length =10;
$string ='Hai to yoo! I like yoo soo!';if(mb_strlen($string, $charset)> $length){
$string = mb_substr($string,0, $length -3, $charset).'...';}
Dieser Code fügt die drei Punkte zur Zeichenfolge hinzu? Mein Code hat ein Link-Tag <a> und wenn ich ihn verknüpfe, wird er zusammen mit den drei Punkten verknüpft, die als anderer Wert vorliegen.
Fello
9
Manchmal müssen Sie die Zeichenfolge auf das letzte vollständige Wort beschränken, dh: Sie möchten nicht, dass das letzte Wort unterbrochen wird, sondern hören mit dem vorletzten Wort auf.
Beispiel: Wir müssen "This is my String" auf 6 Zeichen beschränken, aber anstelle von "This i ..." möchten wir, dass es "This ..." ist, dh wir überspringen diese gebrochenen Buchstaben im letzten Wort.
Puh, ich kann schlecht erklären, hier ist der Code.
Wenn $ str kürzer als $ n_chars ist, wird es unberührt zurückgegeben.
Wenn $ str gleich $ n_chars ist, wird es auch so zurückgegeben, wie es ist.
Wenn $ str länger als $ n_chars ist, sucht es nach dem nächsten zu schneidenden Leerzeichen oder (wenn bis zum Ende keine Leerzeichen mehr vorhanden sind) $ str wird stattdessen bei $ n_chars grob geschnitten.
HINWEIS: Beachten Sie , dass diese Methode bei HTML alle Tags entfernt.
Das Codeigniter-Framework enthält hierfür einen Helfer, den "Texthelfer". Hier ist eine Dokumentation aus dem Codeigniter-Benutzerhandbuch, die gilt: http://codeigniter.com/user_guide/helpers/text_helper.html
(lesen Sie einfach die Abschnitte word_limiter und character_limiter). Hier sind zwei Funktionen, die für Ihre Frage relevant sind:
Ich habe eine Funktion für diese Verwendung entwickelt
function str_short($string,$limit){
$len=strlen($string);if($len>$limit){
$to_sub=$len-$limit;
$crop_temp=substr($string,0,-$to_sub);return $crop_len=$crop_temp."...";}else{return $string;}}
Sie rufen die Funktion einfach mit String und Limite auf,
zB : str_short("hahahahahah",5);
es wird deine Schnur abschneiden und am Ende "..." hinzufügen
:)
Verwenden Sie zum Erstellen innerhalb einer Funktion (zur wiederholten Verwendung) und einer dynamisch begrenzten Länge Folgendes:
function string_length_cutoff($string, $limit, $subtext ='...'){return(strlen($string)> $limit)? substr($string,0,($limit-strlen(subtext))).$subtext : $string;}// example usage:
echo string_length_cutoff('Michelle Lee Hammontree-Garcia',26);// or (for custom substitution text
echo string_length_cutoff('Michelle Lee Hammontree-Garcia',26,'..');
Das wird nicht funktionieren, da trim () bereits existiert.
Gordon
Könnte erklären, warum dieser Ansatz am besten ist, anstatt nur zu behaupten, dass dies der Fall ist?
Robert
1
@ Robert ist einfach und abstrahieren bedeutet, dass Sie den Code nicht immer wieder neu eingeben müssen. Und was am wichtigsten ist: Wenn Sie einen besseren Weg finden, dies zu tun, oder etwas Komplexeres wünschen, ändern Sie nur diese 1-Funktion anstelle von 50 Codeteilen.
TravisO
2
Warum ist die Funktion in Großbuchstaben?
Carlo
Fix: substr von $ var, nicht $ string. Testen Sie dagegen, $limit + 3damit Sie eine Saite nicht knapp über dem Limit kürzen. Abhängig von Ihrer Anwendung (z. B. HTML-Ausgabe) sollten Sie stattdessen eine Entität …verwenden (typografisch ansprechender). Schneiden Sie, wie bereits erwähnt, alle Nicht-Buchstaben vom Ende der (verkürzten) Zeichenfolge ab, bevor Sie die Auslassungspunkte anhängen. Achten Sie schließlich darauf, ob Sie sich in einer Multibyte-Umgebung (z. B. UTF-8) befinden. Sie können strlen () und substr () nicht verwenden.
Phil Perry
1
Ich bin mir nicht sicher, ob dies die schnellste Lösung ist, aber es sieht so aus, als wäre es die kürzeste:
Diese Lösung schneidet keine Wörter, sondern fügt drei Punkte nach dem ersten Leerzeichen hinzu. Ich habe die @ Raccoon29-Lösung bearbeitet und alle Funktionen durch mb_- Funktionen ersetzt, damit dies für alle Sprachen wie Arabisch funktioniert
Wenn die Länge der abgeschnittenen Zeichenfolge nicht unbedingt erforderlich ist, können Sie damit auch das letzte Wort abschneiden und verhindern:
$text ="Knowledge is a natural right of every human being of which no one
has the right to deprive him or her under any pretext, except in a case where a
person does something which deprives him or her of that right. It is mere
stupidity to leave its benefits to certain individuals and teams who monopolize
these while the masses provide the facilities and pay the expenses for the
establishment of public sports.";// we don't want new lines in our preview
$text_only_spaces = preg_replace('/\s+/',' ', $text);// truncates the text
$text_truncated = mb_substr($text_only_spaces,0, mb_strpos($text_only_spaces," ",50));// prevents last word truncation
$preview = trim(mb_substr($text_truncated,0, mb_strrpos($text_truncated," ")));
In diesem Fall $previewwird sein "Knowledge is a natural right of every human being".
Antworten:
Aktualisieren:
Basierend auf dem Vorschlag, die Länge zu überprüfen (und auch ähnliche Längen für zugeschnittene und nicht zugeschnittene Saiten sicherzustellen):
Sie erhalten also eine Zeichenfolge mit maximal 13 Zeichen. entweder 13 (oder weniger) normale Zeichen oder 10 Zeichen, gefolgt von '...'
Update 2:
Oder als Funktion:
Update 3:
Es ist schon eine Weile her, dass ich diese Antwort geschrieben habe und ich benutze diesen Code nicht mehr. Ich bevorzuge diese Funktion, die verhindert, dass die Zeichenfolge in der Mitte eines Wortes mit der
wordwrap
Funktion unterbrochen wird :quelle
$string = wordwrap($string, $length - sizeof($append));
?Diese Funktionalität ist seit Version 4.0.6 in PHP integriert. Siehe die Dokumente .
Beachten Sie, dass die
trimmarker
(die Auslassungspunkte oben) in der abgeschnittenen Länge enthalten sind.quelle
Die Multibyte-Erweiterung kann nützlich sein, wenn Sie die Kontrolle über den Zeichenfolgenzeichensatz benötigen.
quelle
Manchmal müssen Sie die Zeichenfolge auf das letzte vollständige Wort beschränken, dh: Sie möchten nicht, dass das letzte Wort unterbrochen wird, sondern hören mit dem vorletzten Wort auf.
Beispiel: Wir müssen "This is my String" auf 6 Zeichen beschränken, aber anstelle von "This i ..." möchten wir, dass es "This ..." ist, dh wir überspringen diese gebrochenen Buchstaben im letzten Wort.
Puh, ich kann schlecht erklären, hier ist der Code.
quelle
Wenn Sie darauf achten möchten, dass keine Wörter geteilt werden, können Sie Folgendes tun
Wenn $ str kürzer als $ n_chars ist, wird es unberührt zurückgegeben.
Wenn $ str gleich $ n_chars ist, wird es auch so zurückgegeben, wie es ist.
Wenn $ str länger als $ n_chars ist, sucht es nach dem nächsten zu schneidenden Leerzeichen oder (wenn bis zum Ende keine Leerzeichen mehr vorhanden sind) $ str wird stattdessen bei $ n_chars grob geschnitten.
HINWEIS: Beachten Sie , dass diese Methode bei HTML alle Tags entfernt.
quelle
Das Codeigniter-Framework enthält hierfür einen Helfer, den "Texthelfer". Hier ist eine Dokumentation aus dem Codeigniter-Benutzerhandbuch, die gilt: http://codeigniter.com/user_guide/helpers/text_helper.html (lesen Sie einfach die Abschnitte word_limiter und character_limiter). Hier sind zwei Funktionen, die für Ihre Frage relevant sind:
Und
quelle
Verwenden Sie Teilzeichenfolgen
http://php.net/manual/en/function.substr.php
quelle
quelle
Die Funktion, die ich verwendet habe:
Sehen Sie es in Aktion .
quelle
Das ist was ich mache
Dabei steht $ num für die Anzahl der Zeichen und $ tt für die zu manipulierende Zeichenfolge.
quelle
Ich habe eine Funktion für diese Verwendung entwickelt
Sie rufen die Funktion einfach mit String und Limite auf,
zB :
str_short("hahahahahah",5)
;es wird deine Schnur abschneiden und am Ende "..." hinzufügen
:)
quelle
Verwenden Sie zum Erstellen innerhalb einer Funktion (zur wiederholten Verwendung) und einer dynamisch begrenzten Länge Folgendes:
quelle
Am besten abstrahieren Sie Ihren Code wie folgt (beachten Sie, dass das Limit optional ist und standardmäßig 10 beträgt):
quelle
$limit + 3
damit Sie eine Saite nicht knapp über dem Limit kürzen. Abhängig von Ihrer Anwendung (z. B. HTML-Ausgabe) sollten Sie stattdessen eine Entität…
verwenden (typografisch ansprechender). Schneiden Sie, wie bereits erwähnt, alle Nicht-Buchstaben vom Ende der (verkürzten) Zeichenfolge ab, bevor Sie die Auslassungspunkte anhängen. Achten Sie schließlich darauf, ob Sie sich in einer Multibyte-Umgebung (z. B. UTF-8) befinden. Sie können strlen () und substr () nicht verwenden.Ich bin mir nicht sicher, ob dies die schnellste Lösung ist, aber es sieht so aus, als wäre es die kürzeste:
PS Einige Beispiele finden Sie hier https://stackoverflow.com/a/17852480/131337
quelle
substr () ist am besten, Sie sollten auch zuerst die Länge der Zeichenfolge überprüfen
Wordwrap schneidet die Zeichenfolge nicht ab, sondern teilt sie einfach auf ...
quelle
$ width = 10;
oder mit Zeilenumbruch
quelle
Diese Lösung schneidet keine Wörter, sondern fügt drei Punkte nach dem ersten Leerzeichen hinzu. Ich habe die @ Raccoon29-Lösung bearbeitet und alle Funktionen durch mb_- Funktionen ersetzt, damit dies für alle Sprachen wie Arabisch funktioniert
quelle
quelle
Wenn die Länge der abgeschnittenen Zeichenfolge nicht unbedingt erforderlich ist, können Sie damit auch das letzte Wort abschneiden und verhindern:
In diesem Fall
$preview
wird sein"Knowledge is a natural right of every human being"
.Live-Code-Beispiel: http://sandbox.onlinephpfunctions.com/code/25484a8b687d1f5ad93f62082b6379662a6b4713
quelle