¿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?
¿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?
Respuestas:
//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 wordwrap
funció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;
}
$string = wordwrap($string, $length - sizeof($append));
?
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.
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) . '...';
}
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;
}
}
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.
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 = '…')
{
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 = '…')
{
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;
}
}
}
}
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 .
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
:)
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, '..');
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;
}
}
$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:
$result = current(explode("\n", wordwrap($str, $width, "...\n")));
PD: vea algunos ejemplos aquí https://stackoverflow.com/a/17852480/131337
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;
}
$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;
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, $preview
será "Knowledge is a natural right of every human being"
.
Ejemplo de código en vivo: http://sandbox.onlinephpfunctions.com/code/25484a8b687d1f5ad93f62082b6379662a6b4713