2009-07-09 18 views
12

Tengo la siguiente cadena en una variable.¿Cómo obtener los primeros x caracteres de una cadena, sin cortar la última palabra?

 
Stack Overflow is as frictionless and painless to use as we could make it. 

Quiero a buscar primeros 28 caracteres de la línea anterior, por lo que normalmente si uso substr entonces me dará Stack Overflow is as frictio esta salida, pero quiero salida como:

 
Stack Overflow is as... 

¿Hay alguna pre hecho en PHP para hacerlo, o por favor proporcione un código para esto en PHP?

Editado:

quiero un total de 28 caracteres de la cadena sin romper una palabra, si me volverá pocos caracteres de menos de 28 sin romper una palabra, que está muy bien.

+2

Así que en realidad no quieren los primeros 28 caracteres, sino más bien las primeras palabras de longitud de hasta 28. ¿es correcto? –

+1

Sí, deseo total de 28 caracteres .. sin romper una palabra, si me volverá pocos caracteres de menos de 28 sin romper una palabra, está bien ... – Prashant

+1

Que asegurarse de que que se especifica claramente en la pregunta! –

Respuesta

49

Usted puede utilizar la función de wordwrap(), luego explotar en la nueva línea y tomar la primera parte:

$str = wordwrap($str, 28); 
$str = explode("\n", $str); 
$str = $str[0] . '...'; 
+0

me marcó esto como respuesta, pero su creación problema cuando estoy usando 'strip_tags' para la cadena. Tengo una cadena de texto enriquecido (etiquetas html incluidas) y quiero 'strip_tags' de esa cadena y obtener un número fijo de caracteres. Pero luego está volviendo en blanco, porque creo que con 'strip_tags ($ str)' Desaparece todo '/ n' debido a que explota no puede explotar la cadena correctamente y devuelve cadena de espacios en blanco. ¿Alguna solución a este problema? – Prashant

+0

Podría usar 'str_word_count' (http://uk3.php.net/manual/en/function.str-word-count.php) para comprobar el contenido a continuación, iterar a la siguiente' $ str [] 'elemento si devuelve '0'? –

+0

he marcado esto como una respuesta por culpa de su parece ser el mejor y mi problema se resuelve 100% Gracias @ Greg – humphrey

-1

¿por qué no intentar explotar y obtener los primeros 4 elementos de la matriz?

0

intento:

$string='Stack Overflow is as frictionless and painless to use as we could make it.'; 
$n=28; 
$break=strpos(wordwrap($string, $n,'<<||>>'),'<<||>>'); 
print substr($string,0,($break==0?strlen($string):$break)).(strlen($string)>$n?'...':''); 

$string='Stack Overflow'; 
$n=28; 
$break=strpos(wordwrap($string, $n,'<<||>>'),'<<||>>'); 
print substr($string,0,($break==0?strlen($string):$break)).(strlen($string)>$n?'...':''); 
9

De AlfaSky:

function addEllipsis($string, $length, $end='…') 
{ 
    if (strlen($string) > $length) 
    { 
     $length -= strlen($end); 
     $string = substr($string, 0, $length); 
     $string .= $end; 
    } 

    return $string; 
} 

Una alternativa, una aplicación más featureful de Elliott Brueggeman's blog:

/** 
* trims text to a space then adds ellipses if desired 
* @param string $input text to trim 
* @param int $length in characters to trim to 
* @param bool $ellipses if ellipses (...) are to be added 
* @param bool $strip_html if html tags are to be stripped 
* @return string 
*/ 
function trim_text($input, $length, $ellipses = true, $strip_html = true) { 
    //strip tags, if desired 
    if ($strip_html) { 
     $input = strip_tags($input); 
    } 

    //no need to trim, already shorter than trim length 
    if (strlen($input) <= $length) { 
     return $input; 
    } 

    //find last space within length 
    $last_space = strrpos(substr($input, 0, $length), ' '); 
    $trimmed_text = substr($input, 0, $last_space); 

    //add ellipses (...) 
    if ($ellipses) { 
     $trimmed_text .= '...'; 
    } 

    return $trimmed_text; 
} 

(Google búsqueda: "php elipses de equipamiento")

3

He aquí una manera que podría hacerlo:

$str = "Stack Overflow is as frictionless and painless to use as we could make it."; 

$strMax = 28; 
$strTrim = ((strlen($str) < $strMax-3) ? $str : substr($str, 0, $strMax-3)."..."); 

//or this way to trim to full words 
$strFull = ((strlen($str) < $strMax-3) ? $str : strrpos(substr($str, 0, $strMax-3),' ')."..."); 
-1
substr("some string", 0, x); 

Desde el PHP Manual

+0

Ya, pero el uso de esto rompe las palabras a veces ... y he mencionado en mi pregunta que substr no está haciendo lo que quiero , por favor lea la pregunta de nuevo :) – Prashant

+0

Desplácese hacia abajo a la versión avanzada. http://us.php.net/manual/en/function.substr.php#73233 – mcandre

0

Usaría un string tokenizer para dividir la cadena en palabras como esta:

$string = "Stack Overflow is as frictionless and painless to use as we could make it."; 
$tokenized_string = strtok($string, " "); 

A continuación, puede extraer las palabras individuales de la forma que desee.


Editar: Greg tiene una forma mucho mejor y más elegante de hacer lo que quiere. Me gustaría ir con su solución wordwrap().

2

Ésta es la solución más sencilla que conozco ...

substr($string,0,strrpos(substr($string,0,28),' ')).'...'; 
0

puede utilizar wordwrap.

string wordwrap (string $str [, int $width= 75 [, string $break= "\n" [, bool $cut= false ]]]) 

-

function firstNChars($str, $n) { 
    return array_shift(explode("\n", wordwrap($str, $n))); 
} 

echo firstNChars("bla blah long string", 25) . "..."; 

exención de responsabilidad: no probarlo.

Además, si su cadena contiene \n s, puede ser que consiga roto antes.

0
function truncate($string, $limit, $break=" ", $pad="...") { 

// return with no change if string is shorter than $limit 
if(strlen($string) <= $limit){ 
    return $string; 
} 

$string = substr($string, 0, $limit); 
if(false !== ($breakpoint = strrpos($string, $break))){ 
    $string = substr($string, 0, $breakpoint); 
} 
return $string . $pad; 
} 
2

Esta es la manera más fácil:

<?php 
$title = "this is the title of my website!"; 
$number_of_characters = 15; 
echo substr($title, 0, strrpos(substr($title, 0, $number_of_characters), " ")); 
?> 
0

Pueden surgir problemas si la cadena tiene etiquetas html, & nbsp y múltiples espacios. Esto es lo que yo uso que se encarga de todo:

function LimitText($string,$limit,$remove_html=0){ 
    if ($remove_html==1){$string=strip_tags($string);} 
    $newstring = preg_replace("/(?:\s|&nbsp;)+/"," ",$string, -1); // replace &nbsp with space 
    $newstring = preg_replace(array('/\s{2,}/','/[\t\n]/'),' ',$newstring); // replace duplicate spaces 
    if (strlen($newstring)<=$limit) { return $newstring; } // ensure length is more than $limit 
    $newstring = substr($newstring,0,strrpos(substr($newstring,0,$limit),' ')); 
    return $newstring; 
} 

uso:

$string = 'My wife is jealous of stackoverflow'; 
echo LimitText($string,20); 
// My wife is jealous 

uso con html:

$string = '<div><p>My wife is jealous of stackoverflow</p></div>'; 
echo LimitText($string,20,1); 
// My wife is jealous 
0

Esto funciona para mí perfecto

function WordLimt($Keyword,$WordLimit){ 

    if (strlen($Keyword)<=$WordLimit) { return $Keyword; } 
    $Keyword= substr($Keyword,0,strrpos(substr($Keyword,0,$WordLimit),' ')); 
    return $Keyword; 
} 

echo WordLimt($MyWords,28); 

// OutPut : Stack Overflow is as 

se ajustará y romperá en el último espacio sin palabra de corte ...

Cuestiones relacionadas