2010-01-20 11 views
8

Estoy sacando publicaciones de un DB. Quiero recortar el texto a una longitud máxima de 340 caracteres.Recortar texto a 340 caracteres

Si la publicación del blog tiene más de 340 caracteres, quiero recortar el texto hasta la última palabra completa y agregar '...' al final.

E.g. 

NOT: In the begin.... 

BUT: In the ... 
+4

¿Qué te gustaría hacer? si el usuario ingresa una sola palabra con una longitud de 341 caracteres (sin espacios en absoluto en la publicación)? –

Respuesta

11

Las otras respuestas que muestran cómo se puede hacer que el texto aproximadamente 340 caracteres. Si eso está bien para ti, entonces usa una de las otras respuestas.

Pero si quiere un muy estricto máximo de 340 caracteres, las otras respuestas no funcionarán. Debe recordar que agregar '...' puede aumentar la longitud de la cadena y debe tenerlo en cuenta.

$max_length = 340; 

if (strlen($s) > $max_length) 
{ 
    $offset = ($max_length - 3) - strlen($s); 
    $s = substr($s, 0, strrpos($s, ' ', $offset)) . '...'; 
} 

Tenga en cuenta también que aquí estoy usando la sobrecarga de strrpos que lleva un desplazamiento para iniciar la búsqueda directamente desde la ubicación correcta en la cadena, en lugar de primera acortamiento de la cadena.

ver su funcionamiento en línea: ideone

+0

no haría '$. = '...'' ser más fácil en lugar del último paso? – silkAdmin

+1

@silkAdmin: Gracias por tu comentario. He hecho algunas mejoras a mi respuesta. –

+0

Genial, muy viejo hilo, ¡pero estoy seguro de que aún será útil para muchas personas! – silkAdmin

7

intento:

preg_match('/^.{0,340}(?:.*?)\b/siu', $text, $matches); 
echo $matches[0] . '...'; 
+4

De forma predeterminada, el '.' no coincide con los saltos de línea. Entonces, cuando hay saltos de línea antes del carácter 340, no funcionará. Agregar un modificador 's' al final hará el truco. –

26

Parece que se quiere recortar primero el texto hasta 340 caracteres exactamente, a continuación, encontrar la ubicación de la última '' en la cadena y recortar hacia abajo para que cantidad. De esta manera:

$string = substr($string, 0, 340); 
$string = substr($string, 0, strrpos($string, ' ')) . " ..."; 
+0

Necesita un poco de brillo (compruebe si la cadena necesita acortarse, etc.) pero corta y dulce. – adamJLev

0

puede intentar utilizar las funciones que viene con PHP, como el ajuste de línea

print wordwrap($text,340) . "..."; 
0

trim_characters función ($ texto, $ longitud = 340) {

$length = (int) $length; 
$text = trim(strip_tags($text)); 

if (strlen($text) > $length) { 
    $text = substr($text, 0, $length + 1); 
    $words = preg_split("/[\s]| /", $text, -1, PREG_SPLIT_NO_EMPTY); 
    preg_match("/[\s]| /", $text, $lastchar, 0, $length); 
    if (empty($lastchar)) 
     array_pop($words); 

    $text = implode(' ', $words); 
} 

return $text; 

}

Utilice esta función trim_characters() para recorta una cadena de palabras a un número específico de caracteres, deteniéndose elegantemente en espacios en blanco. Creo que esto es útil para usted.

2

puse la respuesta de Juan Conde en un método:

function softTrim($text, $count, $wrapText='...'){ 

    if(strlen($text)>$count){ 
     preg_match('/^.{0,' . $count . '}(?:.*?)\b/siu', $text, $matches); 
     $text = $matches[0]; 
    }else{ 
     $wrapText = ''; 
    } 
    return $text . $wrapText; 
} 

Ejemplos:

echo softTrim("Lorem Ipsum is simply dummy text", 10); 
/* Output: Lorem Ipsum... */ 

echo softTrim("Lorem Ipsum is simply dummy text", 33); 
/* Output: Lorem Ipsum is simply dummy text */ 

echo softTrim("LoremIpsumissimplydummytext", 10); 
/* Output: LoremIpsumissimplydummytext... */ 
13

Si ha habilitado la extensión mbstring (que es en la mayoría de los servidores de hoy en día), puede utilizar la función mb_strimwidth.

echo mb_strimwidth($string, 0, 340, '...'); 
+0

¡Salvemos todos los liners! Muy buena captura :) – Gruber

+0

Muy sorprendido por qué esto no es votado más. Solución elegante. – pihyper

0

Por qué de esta manera?

  • me gusta la expresión regular solución sobre subcadena, para recoger cualquier otro que se rompe palabra de espacio en blanco (interpunction etc.) Solución
  • Juan Condoe no es perfectamente correcto, ya que el ajuste de texto de 340 caracteres y luego terminar la última palabra (por lo que a menudo será más largo de lo deseado)

real expresiones regulares solución es muy simple :

/^(.{0,339}\w\b)/su 

método completo en PHP podría tener este aspecto:

function trim_length($text, $maxLength, $trimIndicator = '...') 
{ 
     if(strlen($text) > $maxLength) { 

      $shownLength = $maxLength - strlen($trimIndicator); 

      if ($shownLength < 1) { 

       throw new \InvalidArgumentException('Second argument for ' . __METHOD__ . '() is too small.'); 
      } 

      preg_match('/^(.{0,' . ($shownLength - 1) . '}\w\b)/su', $text, $matches);        

      return (isset($matches[1]) ? $matches[1] : substr($text, 0, $shownLength)) . $trimIndicator ; 
     } 

     return $text; 
} 

Más explicación:

  • $shownLength es mantener límite muy estricto (como Mark Byers mencionado)
  • excepción en caso longitud dada era demasiado pequeño
  • \w\b parte es evitar espacio en blanco o interpunction en el final (ver 1 a continuación)
  • En caso primera palabra sería más largo que la longitud máxima deseada, esa palabra será brutalmente cortado

  1. A pesar del hecho de que en cuestión resultado In the ... se describe como deseado, siento In the... es más suave (también no como In the,... etc.)
0

solución más simple

$text_to_be_trim= "Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry standard."; 
if(strlen($text_to_be_trim) > 20) 
    $text_to_be_trim= substr($text_to_be_trim,0,20).'....'; 

Para texto de varios bytes

$stringText= "UTIL CONTROL DISTRIBUCION AMARRE CIGÜEÑAL"; 
$string_encoding = 'utf8'; 
$s_trunc = mb_substr($stringText, 0, 37, $string_encoding); 
echo $s_trunc; 
+0

Este puede fallar cuando conoces un char especial. Me acaba de pasar con ü. Si talas ahí, falla. Si vas un personaje más, funciona. Entonces, la respuesta de Mark Byers es mi preferida. Funciona perfectamente. – mayid

+0

¿Podría compartir el texto que se va a recortar? Para que pueda verificar mi solución. –

+0

Claro. Prueba esto y entra en el Ü: "UTIL CONTROL DISTRIBUCION AMARRE CIGÜEÑAL". Carta 40 para mí – mayid