Obtener los primeros n caracteres de una cadena

320

¿Cómo puedo obtener los primeros n caracteres de una cadena en PHP? ¿Cuál es la forma más rápida de recortar una cadena a un número específico de caracteres y agregar '...' si es necesario?

Alex
fuente
55
podría ser mejor usar el carácter de puntos suspensivos ...
Keet
1
mira mi respuesta si necesitas evitar cortar palabras.
TechNyquist
Prueba este enlace, puede ayudarte ... stackoverflow.com/a/26098951/3944217
edCoder

Respuestas:

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

Actualizar:

Según la sugerencia para verificar la longitud (y también garantizar longitudes similares en cadenas recortadas y no recortadas):

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

Entonces obtendrá una cadena de máximo 13 caracteres; 13 (o menos) caracteres normales o 10 caracteres seguidos de '...'

Actualización 2:

O como función:

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

Actualización 3:

Ha pasado un tiempo desde que escribí esta respuesta y en realidad ya no uso este código. Prefiero esta función que evita romper la cadena en el medio de una palabra usando la wordwrapfunción:

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
fuente
11
podría ser mejor reemplazar con puntos suspensivos (...) en lugar de 3 puntos (...)
Keet
3
Me encanta esto, pero lo cambié y uso lo siguiente para eliminar espacios en blanco al final: $ string = substr (trim ($ string), 0,10) .'... '; De esa manera obtienes algo como "Me gusta ..." en lugar de "Me gusta ...".
Kenton de Jong
28
"hellip" - me llevó algún tiempo entender que no estábamos hablando de la dirección IP de Satanás
Lucas Bernardo de Sousa
2
La actualización 3 es la más útil.
milkovsky
En caso de que haya un límite máximo en la longitud de la cadena devuelta, ¿no debería ser la línea 5 de la actualización 3 $string = wordwrap($string, $length - sizeof($append)); ?
Michael Crenshaw
115

Esta funcionalidad se ha integrado en PHP desde la versión 4.0.6. Ver los documentos .

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

// outputs Hello W...

Tenga en cuenta que trimmarker(los puntos suspensivos anteriores) se incluyen en la longitud truncada.

bruchowski
fuente
44
Funcionó perfectamente para mí. La respuesta principal no funcionó, y me alegro de que no lo hiciera porque seguí desplazándome y encontré esta gema.
Eduardo
¡Gracias, siempre usé este método más largo y antiguo!
gr3g
1
Dan, es posible que quieras ser un poco más específico sobre qué parte de la respuesta principal no funcionó para ti. La función truncate () funcionó perfectamente para mí y la ventaja de esa respuesta sobre la respuesta de bruchowski es que se rompe en los límites de las palabras; asumiendo que te importa ese tipo de cosas.
pdwalker
2
¡buena atrapada! muchos desarrolladores experimentados de PHP no conocen esta función :)
jroi_web
1
La respuesta superior (en este momento) ( stackoverflow.com/a/3161830/236306 ) no hizo nada (como si no hubiera usado el fn). No se porque. Sin embargo, esta respuesta parece perfecta y viene con el beneficio adicional de trabajar.
Alan
15

La extensión Multibyte puede ser útil si necesita control sobre el conjunto de caracteres de la cadena.

$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
fuente
Este código está agregando los tres puntos a la cadena? mi código tiene una etiqueta de enlace <a> y cuando lo vincule lo vinculará con los tres puntos, que tendrá un valor diferente.
fello
9

a veces, necesita limitar la cadena a la última palabra completa, es decir: no desea que se rompa la última palabra, sino que se detiene con la segunda última palabra.

por ejemplo: necesitamos limitar "This is my String" a 6 caracteres pero en lugar de 'This i ... "queremos que sea' This ...", es decir, omitiremos esas letras rotas en la última palabra.

uf, soy malo para explicar, aquí está el código.

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
fuente
9

Si desea cortar teniendo cuidado de no dividir palabras, puede hacer lo siguiente

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;
}

si $ str es más corto que $ n_chars, lo devuelve intacto.

Si $ str es igual a $ n_chars, también lo devuelve como está.

si $ str es más largo que $ n_chars, entonces busca el siguiente espacio para cortar o (si no hay más espacios hasta el final) $ str se corta groseramente en su lugar en $ n_chars.

NOTA: tenga en cuenta que este método eliminará todas las etiquetas en caso de HTML.

TechNyquist
fuente
8

El marco codeigniter contiene un ayudante para esto, llamado "ayudante de texto". Aquí hay alguna documentación de la guía del usuario de codeigniter que se aplica: http://codeigniter.com/user_guide/helpers/text_helper.html (solo lea las secciones word_limiter y character_limiter). Aquí hay dos funciones relevantes para su pregunta:

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;
    }
}

Y

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;
            }       
        }
    }
}
Mateo
fuente
4

Usar subcadena

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

$foo = substr("abcde",0, 3) . "...";
Dlongnecker
fuente
3
Este código siempre agregará ... a la cadena, que no quería.
TravisO
Tienes toda la razón, y edité la respuesta en consecuencia. (Respuesta actualmente pendiente de revisión revisado SO pares)
Chaya Cooper
3
if(strlen($text) > 10)
     $text = substr($text,0,10) . "...";
HCL
fuente
De @Brendon Bullen arriba ... $ string = (strlen ($ string)> 13)? substr ($ cadena, 0,10) .'... ': $ cadena; Agradable !
MarcoZen
1

La función que utilicé:

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

Véalo en acción .

Benjamin Crouzier
fuente
1

Esto es lo que hago

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

donde $ num representa el número de caracteres y $ tt la cadena para la manipulación.

christoz
fuente
1

Desarrollé una función para este uso.

 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;
            }
        }

que acaba de llamar a la función con una cuerda y limite
por ejemplo: str_short("hahahahahah",5);
cortará su cadena y agregará "..." al final
:)

Saikelu
fuente
1

Para crear dentro de una función (para uso repetido) y una longitud dinámica limitada, use:

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
fuente
1

Es mejor resumir su código de esta manera (observe que el límite es opcional y el valor predeterminado es 10):

print limit($string);


function limit($var, $limit=10)
{
    if ( strlen($var) > $limit )
    {
        return substr($string, 0, $limit) . '...';
    }
    else
    {
        return $var;
    }
}
TravisO
fuente
1
Eso no funcionará porque trim () ya existe.
Gordon
¿Podría explicar por qué este enfoque es mejor en lugar de simplemente afirmar que lo es?
Robert
1
@Robert es simple, y abstraer significa que no tienes que volver a escribir el código una y otra vez. Y lo más importante, si encuentra una mejor manera de hacer esto, o si desea algo más complejo, solo cambia esta función 1 en lugar de 50 piezas de código.
TravisO
2
¿Por qué la función es mayúscula?
Carlo
Arreglo: substr de $ var, no $ string. Pruebe contra $limit + 3para que no recorte una cadena justo por encima del límite. Dependiendo de su aplicación (p. Ej., Salida HTML), considere usar una entidad &hellip;(tipográficamente más agradable). Como se sugirió anteriormente, recorte las letras que no sean del final de la cadena (acortada) antes de agregar los puntos suspensivos. Finalmente, tenga cuidado si está en un entorno multibyte (p. Ej., UTF-8): no puede usar strlen () y substr ().
Phil Perry
1

No estoy seguro de si esta es la solución más rápida, pero parece que es la más corta:

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

PD: vea algunos ejemplos aquí https://stackoverflow.com/a/17852480/131337

Sergiy Sokolenko
fuente
0

substr () sería lo mejor, también querrá verificar primero la longitud de la cadena

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

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

wordwrap no recortará la cadena, simplemente la dividirá ...

tsgrasser
fuente
0

$ ancho = 10;

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

o con wordwrap

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

esta solución no cortará palabras, agregará tres puntos después del primer espacio. Edité la solución @ Raccoon29 y reemplacé todas las funciones con funciones mb_ para que esto funcione para todos los idiomas, como el árabe.

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
fuente
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
fuente
0

Si no hay un requisito estricto sobre la longitud de la cadena truncada, se puede usar esto para truncar y evitar cortar la última palabra también:

$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, " ")));

En este caso, $previewserá "Knowledge is a natural right of every human being".

Ejemplo de código en vivo: http://sandbox.onlinephpfunctions.com/code/25484a8b687d1f5ad93f62082b6379662a6b4713

jim_kastrin
fuente