¿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?
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:
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 .
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.
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.
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:
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,'..');
¿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 …(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:
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.
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".
Respuestas:
Actualizar:
Según la sugerencia para verificar la longitud (y también garantizar longitudes similares en cadenas recortadas y no recortadas):
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:
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
wordwrap
función:fuente
$string = wordwrap($string, $length - sizeof($append));
?Esta funcionalidad se ha integrado en PHP desde la versión 4.0.6. Ver los documentos .
Tenga en cuenta que
trimmarker
(los puntos suspensivos anteriores) se incluyen en la longitud truncada.fuente
La extensión Multibyte puede ser útil si necesita control sobre el conjunto de caracteres de la cadena.
fuente
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.
fuente
Si desea cortar teniendo cuidado de no dividir palabras, puede hacer lo siguiente
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.
fuente
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:
Y
fuente
Usar subcadena
http://php.net/manual/en/function.substr.php
fuente
fuente
La función que utilicé:
Véalo en acción .
fuente
Esto es lo que hago
donde $ num representa el número de caracteres y $ tt la cadena para la manipulación.
fuente
Desarrollé una función para este uso.
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
:)
fuente
Para crear dentro de una función (para uso repetido) y una longitud dinámica limitada, use:
fuente
Es mejor resumir su código de esta manera (observe que el límite es opcional y el valor predeterminado es 10):
fuente
$limit + 3
para que no recorte una cadena justo por encima del límite. Dependiendo de su aplicación (p. Ej., Salida HTML), considere usar una entidad…
(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 ().No estoy seguro de si esta es la solución más rápida, pero parece que es la más corta:
PD: vea algunos ejemplos aquí https://stackoverflow.com/a/17852480/131337
fuente
substr () sería lo mejor, también querrá verificar primero la longitud de la cadena
wordwrap no recortará la cadena, simplemente la dividirá ...
fuente
$ ancho = 10;
o con wordwrap
fuente
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.
fuente
fuente
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:
En este caso,
$preview
será"Knowledge is a natural right of every human being"
.Ejemplo de código en vivo: http://sandbox.onlinephpfunctions.com/code/25484a8b687d1f5ad93f62082b6379662a6b4713
fuente