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?
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?
Antworten:
//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 wordwrap
Funktion 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;
}
$string = wordwrap($string, $length - sizeof($append));
?
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.
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) . '...';
}
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;
}
}
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.
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 = '…')
{
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 = '…')
{
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;
}
}
}
}
Verwenden Sie Teilzeichenfolgen
http://php.net/manual/en/function.substr.php
$foo = substr("abcde",0, 3) . "...";
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 .
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, '..');
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;
}
}
$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:
$result = current(explode("\n", wordwrap($str, $width, "...\n")));
PS Einige Beispiele finden Sie hier https://stackoverflow.com/a/17852480/131337
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;
}
$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;
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 $preview
wird sein "Knowledge is a natural right of every human being"
.
Live-Code-Beispiel: http://sandbox.onlinephpfunctions.com/code/25484a8b687d1f5ad93f62082b6379662a6b4713