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?

Alex
quelle
5
Vielleicht ist es besser, das Auslassungszeichen zu verwenden…
Keet
1
Schauen Sie sich meine Antwort an, wenn Sie das Schneiden von Wörtern vermeiden müssen.
TechNyquist
Versuchen Sie diesen Link, kann Ihnen helfen ... stackoverflow.com/a/26098951/3944217
edCoder

Antworten:

577
//The simple version for 10 Characters from the beginning of the string
$string = substr($string,0,10).'...';

Aktualisieren:

Basierend auf dem Vorschlag, die Länge zu überprüfen (und auch ähnliche Längen für zugeschnittene und nicht zugeschnittene Saiten sicherzustellen):

$string = (strlen($string) > 13) ? substr($string,0,10).'...' : $string;

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:

function truncate($string, $length, $dots = "...") {
    return (strlen($string) > $length) ? substr($string, 0, $length - strlen($dots)) . $dots : $string;
}

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 wordwrapFunktion unterbrochen wird :

function truncate($string,$length=100,$append="…") {
  $string = trim($string);

  if(strlen($string) > $length) {
    $string = wordwrap($string, $length);
    $string = explode("\n", $string, 2);
    $string = $string[0] . $append;
  }

  return $string;
}
Brendan Bullen
quelle
11
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 .

echo mb_strimwidth('Hello World', 0, 10, '...');

// outputs Hello W...

Beachten Sie, dass die trimmarker(die Auslassungspunkte oben) in der abgeschnittenen Länge enthalten sind.

bruchowski
quelle
4
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) . '...';
}
Emil Vikström
quelle
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.

class Fun {

    public function limit_text($text, $len) {
        if (strlen($text) < $len) {
            return $text;
        }
        $text_words = explode(' ', $text);
        $out = null;


        foreach ($text_words as $word) {
            if ((strlen($word) > $len) && $out == null) {

                return substr($word, 0, $len) . "...";
            }
            if ((strlen($out) + strlen($word)) > $len) {
                return $out . "...";
            }
            $out.=" " . $word;
        }
        return $out;
    }

}
MortalViews
quelle
9

Wenn Sie darauf achten möchten, dass keine Wörter geteilt werden, können Sie Folgendes tun

function ellipse($str,$n_chars,$crop_str=' [...]')
{
    $buff=strip_tags($str);
    if(strlen($buff) > $n_chars)
    {
        $cut_index=strpos($buff,' ',$n_chars);
        $buff=substr($buff,0,($cut_index===false? $n_chars: $cut_index+1)).$crop_str;
    }
    return $buff;
}

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.

TechNyquist
quelle
8

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:

if ( ! function_exists('word_limiter'))
{
    function word_limiter($str, $limit = 100, $end_char = '&#8230;')
    {
        if (trim($str) == '')
        {
            return $str;
        }

        preg_match('/^\s*+(?:\S++\s*+){1,'.(int) $limit.'}/', $str, $matches);

        if (strlen($str) == strlen($matches[0]))
        {
            $end_char = '';
        }

        return rtrim($matches[0]).$end_char;
    }
}

Und

if ( ! function_exists('character_limiter'))
{
    function character_limiter($str, $n = 500, $end_char = '&#8230;')
    {
        if (strlen($str) < $n)
        {
            return $str;
        }

        $str = preg_replace("/\s+/", ' ', str_replace(array("\r\n", "\r", "\n"), ' ', $str));

        if (strlen($str) <= $n)
        {
            return $str;
        }

        $out = "";
        foreach (explode(' ', trim($str)) as $val)
        {
            $out .= $val.' ';

            if (strlen($out) >= $n)
            {
                $out = trim($out);
                return (strlen($out) == strlen($str)) ? $out : $out.$end_char;
            }       
        }
    }
}
Matthew
quelle
4

Verwenden Sie Teilzeichenfolgen

http://php.net/manual/en/function.substr.php

$foo = substr("abcde",0, 3) . "...";
Dlongnecker
quelle
3
Dieser Code fügt immer ... zu der Zeichenfolge hinzu, die er nicht wollte.
TravisO
Sie haben absolut Recht, und ich habe die Antwort entsprechend bearbeitet. (Überarbeitete Antwort wartet derzeit auf SO Peer Review)
Chaya Cooper
3
if(strlen($text) > 10)
     $text = substr($text,0,10) . "...";
HCL
quelle
Von @Brendon Bullen oben .. $ string = (strlen ($ string)> 13)? substr ($ string, 0,10) .'... ': $ string; Nett !
MarcoZen
1

Die Funktion, die ich verwendet habe:

function cutAfter($string, $len = 30, $append = '...') {
        return (strlen($string) > $len) ? 
          substr($string, 0, $len - strlen($append)) . $append : 
          $string;
}

Sehen Sie es in Aktion .

Benjamin Crouzier
quelle
1

Das ist was ich mache

    function cutat($num, $tt){
        if (mb_strlen($tt)>$num){
            $tt=mb_substr($tt,0,$num-2).'...';
        }
        return $tt;
    }

Dabei steht $ num für die Anzahl der Zeichen und $ tt für die zu manipulierende Zeichenfolge.

christoz
quelle
1

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
:)

Saikelu
quelle
1

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, '..');
tfont
quelle
1

Am besten abstrahieren Sie Ihren Code wie folgt (beachten Sie, dass das Limit optional ist und standardmäßig 10 beträgt):

print limit($string);


function limit($var, $limit=10)
{
    if ( strlen($var) > $limit )
    {
        return substr($string, 0, $limit) . '...';
    }
    else
    {
        return $var;
    }
}
TravisO
quelle
1
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 &hellip;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:

$result = current(explode("\n", wordwrap($str, $width, "...\n")));

PS Einige Beispiele finden Sie hier https://stackoverflow.com/a/17852480/131337

Sergiy Sokolenko
quelle
0

substr () ist am besten, Sie sollten auch zuerst die Länge der Zeichenfolge überprüfen

$str = 'someLongString';
$max = 7;

if(strlen($str) > $max) {
   $str = substr($str, 0, $max) . '...';
}

Wordwrap schneidet die Zeichenfolge nicht ab, sondern teilt sie einfach auf ...

tsgrasser
quelle
0

$ width = 10;

$a = preg_replace ("~^(.{{$width}})(.+)~", '\\1…', $a);

oder mit Zeilenumbruch

$a = preg_replace ("~^(.{1,${width}}\b)(.+)~", '\\1…', $a);
akond
quelle
0

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

function cut_string($str, $n_chars, $crop_str = '...') {
    $buff = strip_tags($str);
    if (mb_strlen($buff) > $n_chars) {
        $cut_index = mb_strpos($buff, ' ', $n_chars);
        $buff = mb_substr($buff, 0, ($cut_index === false ? $n_chars : $cut_index + 1), "UTF-8") . $crop_str;
    }
    return $buff;
}
Waqleh
quelle
0
$yourString = "bla blaaa bla blllla bla bla";
$out = "";
if(strlen($yourString) > 22) {
    while(strlen($yourString) > 22) {
        $pos = strrpos($yourString, " ");
        if($pos !== false && $pos <= 22) {
            $out = substr($yourString,0,$pos);
            break;
        } else {
            $yourString = substr($yourString,0,$pos);
            continue;
        }
    }
} else {
    $out = $yourString;
}
echo "Output String: ".$out;
Jaykishan
quelle
0

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".

Live-Code-Beispiel: http://sandbox.onlinephpfunctions.com/code/25484a8b687d1f5ad93f62082b6379662a6b4713

jim_kastrin
quelle