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?


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

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.


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) . '...';
}

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

}

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.


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


3
if(strlen($text) > 10)
     $text = substr($text,0,10) . "...";

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 .


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.


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


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

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

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


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


0

$ ancho = 10;

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

o con wordwrap

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

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

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;

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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.