2009-07-09 6 views
12

Ho la seguente stringa in una variabile.Come ottenere i primi x caratteri da una stringa, senza tagliare l'ultima parola?

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

voglio prendere primi 28 caratteri dalla linea di cui sopra, così normalmente se uso substr allora mi darà Stack Overflow is as frictio questa uscita ma voglio uscita come:

 
Stack Overflow is as... 

C'è qualche pre funzione fatta in PHP per farlo, o per favore fornitemi il codice per questo in PHP?

Modificato:

Voglio totale 28 caratteri dalla stringa senza una parola, se tornerà mi pochi meno caratteri a 28 senza una parola, va bene.

+2

Quindi non vuoi veramente i primi 28 caratteri ma piuttosto le prime parole fino alla lunghezza 28. È corretto? –

+1

Sì, voglio un totale di 28 caratteri .. senza spaccare una parola, se mi restituirà meno caratteri di 28 senza spezzare una parola, va bene ... – Prashant

+1

Quindi assicurati che sia chiaramente specificato nella domanda! –

risposta

49

È possibile utilizzare la funzione wordwrap(), poi esplodere sulla nuova linea e prendere la prima parte:

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

Ho contrassegnato questo come risposta, ma crea problemi quando sto usando 'strip_tags' per stringa. Ho una stringa di testo ricco (tag HTML incluso) e voglio 'strip_tags' da quella stringa e quindi ottenere il numero di caratteri fisso. Ma poi il suo ritorno è vuoto, perché penso che con 'strip_tags ($ str)' svanisce tutto '/ n' a causa del quale esplode non è in grado di esplodere correttamente la stringa e restituisce una stringa vuota. Qualche soluzione a questo problema? – Prashant

+0

Potresti usare 'str_word_count' (http://uk3.php.net/manual/en/function.str-word-count.php) per controllare i contenuti e poi iterare al prossimo elemento' $ str [] 'se restituisce '0'? –

+0

Ho contrassegnato questo come una risposta perché sembra essere il migliore e il mio problema è risolto al 100% Grazie @Greg – humphrey

-1

perché non provare a farlo esplodere e ottenere i primi 4 elementi dell'array?

0

prova:

$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

Da AlfaSky:

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

    return $string; 
} 

Un supplente, più ricco di funzioni implementazione da 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; 
} 

(ricerca di Google: "php ellissi di assetto")

3

Ecco un modo si potrebbe fare:

$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); 

Dal PHP Manual

+0

Ya ma usare questo rompe le parole a volte ... e ho accennato nella mia domanda che substr non sta facendo quello che voglio , leggi di nuovo la domanda :) – Prashant

+0

Scorri verso il basso fino alla versione avanzata. http://us.php.net/manual/en/function.substr.php#73233 – mcandre

0

Vorrei usare uno string tokenizer per dividere la stringa in parole molto simili a questa:

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

Quindi è possibile estrarre le singole parole nel modo desiderato.


Modifica: Greg ha un modo molto migliore e più elegante di fare quello che vuoi. Vorrei andare con la sua soluzione wordwrap().

2

Questa è la soluzione più semplice che io conosca ...

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

è possibile utilizzare 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) . "..."; 

disclaimer: non testarlo.

Inoltre, se la stringa contiene \n s, potrebbe rompersi prima.

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

Questo è il modo più semplice:

<?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

I problemi possono sorgere se la stringa ha tag html, & nbsp e gli spazi multipli. Ecco quello che io uso che si occupa di tutto:

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; 
} 

utilizzo:

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

utilizzo con html:

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

Questo sta lavorando per me perfetta

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 

si regolerà e si romperà all'ultimo spazio senza parola tagliata ...