2010-08-21 5 views
8

Cuando uso substr($string,0,100), proporciona los primeros 100 caracteres. A veces dejaba la última palabra incompleta. Eso parece extraño. ¿Puedo limitar por palabra en lugar de char?Cómo capturar palabras completas usando substr() en PHP, ¿límite por palabra?

+1

Podría explicar con más detalle lo que su definición de una "palabra" es? ¿Estamos hablando solo de palabras en inglés? Palabras en cualquier idioma? Cualquier secuencia de letras, ya sea una palabra real o no? ¿Qué hay de los números? ¿Puntuación? Otros símbolos? Es '<<<<<<<<' una palabra? etc ... –

+0

¿El texto de entrada podría contener nuevos caracteres de línea? –

+0

Pruebe este enlace, puede ayudarlo http://stackoverflow.com/a/26098951/3944217 – edCoder

Respuesta

15

Si solo cuenta las palabras, la picadura resultante podría ser muy larga ya que una sola "palabra" podría tener 30 caracteres o más. Sugeriría en cambio truncar el texto a 100 caracteres, excepto si esto hace que una palabra se trunque, entonces también debería eliminar la parte truncada de la palabra. Esto está cubierto por esta pregunta relacionada:

How to Truncate a string in PHP to the word closest to a certain number of characters?

Uso wordwrap

$your_desired_width = 100; 
if (strlen($string) > $your_desired_width) 
{ 
    $string = wordwrap($string, 100); 
    $i = strpos($string, "\n"); 
    if ($i) { 
     $string = substr($string, 0, $i); 
    } 
} 

Ésta es una versión modificada de la respuesta here. si el texto de entrada podría ser muy larga puede agregar esta línea antes de la llamada de ajuste de línea para evitar wordwrap tener que analizar todo el texto:

$string = substr($string, 0, 101); 

Utilizar una expresión regular(Source)

$string = preg_replace('/\s+?(\S+)?$/', '', substr($string, 0, 100)); 
+1

Evitaría el uso de la función wordwrap ya que innecesariamente analizará toda la cadena. La expresión regular es la mejor de las dos, IMO. – Matthew

+0

@konforce: acepto que la solución de expresión regular es simple y flexible, pero algunas personas no se sienten cómodas con las expresiones regulares. He propuesto una nueva versión de la solución wordwrap. ¿Está bien ahora? –

+0

la expresión regular eliminará accidentalmente la última palabra. He agregado código para incluir un cheque. Ver la edición. –

0

I Haría algo como:

<?php 

     function cut_text($text, $len) 
     { 
       for ($i = 0; $i < 10; ++$i) 
       { 
         $c = $text[$len + $i]; 
         if ($c == ' ' || $c == "\t" || $c == "\r" || $c == "\n" || $c == '-') 
           break; 
       } 

       if ($i == 10) $i = 0; 

       return rtrim(substr($text, 0, $len + $i)); 
     } 

     echo cut_text("Hello, World!", 3)."\n"; 
?> 

Simplemente comience en algún punto ($ len) y avance una cierta cantidad de caracteres ters ($ i) en busca de un carácter de ruptura (p. ej., espacio en blanco). También puede mirar hacia atrás (- $ i) o en ambas direcciones, dependiendo de lo que esté buscando.

3
$a = explode('|', wordwrap($string, 100, '|'); 
print $a[0]; 
+1

Esto falla si el personaje | accidentalmente ocurre en $ string. Mejor uso chr (0) o algo así que nunca ocurrirá en $ string. – Peter

0
// Trim very long text to 120 characters. Add an ellipsis if the text is trimmed. 
if(strlen($very_long_text) > 120) { 
    $matches = array(); 
    preg_match("/^(.{1,120})[\s]/i", $very_long_text, $matches); 
    $trimmed_text = $matches[0]. '...'; 
} 
1

Prueba una sola línea de código del

$string = preg_replace('/\s+?(\S+)?$/', '', substr($string, 0, $length)); 
0

Ésta es una solución muy similar a la de Evernden de Scott, pero también funciona si el carácter | accidentalmente se produce en la cadena:

$result = explode(chr(0), wordwrap($longtext, $len, chr(0)))[0]; 
0

Probé este sencillo y funcionó para mí

<?php echo substr($content, 0, strpos($content, ' ', 200)); ?> 
Cuestiones relacionadas