Come posso ottenere i primi n caratteri di una stringa in PHP? Qual è il modo più veloce per tagliare una stringa a un numero specifico di caratteri e aggiungere '...' se necessario?
Come posso ottenere i primi n caratteri di una stringa in PHP? Qual è il modo più veloce per tagliare una stringa a un numero specifico di caratteri e aggiungere '...' se necessario?
Risposte:
//The simple version for 10 Characters from the beginning of the string
$string = substr($string,0,10).'...';
Aggiornare:
Sulla base di suggerimenti per il controllo della lunghezza (e per garantire lunghezze simili su stringhe tagliate e non tagliate):
$string = (strlen($string) > 13) ? substr($string,0,10).'...' : $string;
Quindi otterrai una stringa di massimo 13 caratteri; 13 (o meno) caratteri normali o 10 caratteri seguiti da '...'
Aggiornamento 2:
O come funzione:
function truncate($string, $length, $dots = "...") {
return (strlen($string) > $length) ? substr($string, 0, $length - strlen($dots)) . $dots : $string;
}
Aggiornamento 3:
È da un po 'che non scrivo questa risposta e non uso più questo codice. Preferisco questa funzione che impedisce di spezzare la stringa nel mezzo di una parola usando la wordwrap
funzione:
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));
?
Questa funzionalità è stata integrata in PHP dalla versione 4.0.6. Vedi i documenti .
echo mb_strimwidth('Hello World', 0, 10, '...');
// outputs Hello W...
Si noti che i trimmarker
(puntini di sospensione sopra) sono inclusi nella lunghezza troncata.
L'estensione Multibyte può tornare utile se è necessario il controllo del set di stringhe.
$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 volte, devi limitare la stringa all'ultima parola completa, ovvero: non vuoi che l'ultima parola sia spezzata, ma ti fermi con la seconda ultima parola.
ad esempio: dobbiamo limitare "Questa è la mia stringa" a 6 caratteri ma invece di "Questo io ..." vogliamo che sia "Questo ...", cioè salteremo le lettere rotte nell'ultima parola.
cavolo, sono cattivo a spiegare, ecco il codice.
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;
}
}
Se vuoi tagliare facendo attenzione a non dividere le parole puoi fare quanto segue
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;
}
se $ str è più corto di $ n_chars lo restituisce intatto.
Se $ str è uguale a $ n_chars lo restituisce pure.
se $ str è più lungo di $ n_chars, cerca lo spazio successivo da tagliare o (se non ci sono più spazi fino alla fine) $ str viene tagliato bruscamente invece di $ n_chars.
NOTA: tenere presente che questo metodo rimuoverà tutti i tag in caso di HTML.
Il framework codeigniter contiene un helper per questo, chiamato "text helper". Ecco un po 'di documentazione dalla guida per l'utente di codeigniter che si applica: http://codeigniter.com/user_guide/helpers/text_helper.html (basta leggere le sezioni word_limiter e character_limiter). Ecco due funzioni pertinenti alla tua domanda:
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;
}
}
E
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 funzione che ho usato:
function cutAfter($string, $len = 30, $append = '...') {
return (strlen($string) > $len) ?
substr($string, 0, $len - strlen($append)) . $append :
$string;
}
Guardalo in azione .
Ho sviluppato una funzione per questo 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;
}
}
basta chiamare la funzione con lo spago e limite
ad esempio: str_short("hahahahahah",5)
;
taglierà la tua stringa e aggiungerà "..." alla fine
:)
Per creare all'interno di una funzione (per un uso ripetuto) e una lunghezza dinamica limitata, utilizzare:
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, '..');
È meglio astrarre il codice in questo modo (notare che il limite è facoltativo e il valore predefinito è 10):
print limit($string);
function limit($var, $limit=10)
{
if ( strlen($var) > $limit )
{
return substr($string, 0, $limit) . '...';
}
else
{
return $var;
}
}
$limit + 3
modo da non tagliare una corda appena oltre il limite. A seconda dell'applicazione (ad es. Output HTML), considera invece l'utilizzo di un'entità …
(tipograficamente più gradevole). Come suggerito in precedenza, tagliare tutte le non lettere dalla fine della stringa (abbreviata) prima di aggiungere i puntini di sospensione. Infine, fai attenzione se ti trovi in un ambiente multibyte (ad es. UTF-8) - non puoi usare strlen () e substr ().
Non sono sicuro che questa sia la soluzione più veloce, ma sembra che sia la più breve:
$result = current(explode("\n", wordwrap($str, $width, "...\n")));
PS Vedi alcuni esempi qui https://stackoverflow.com/a/17852480/131337
questa soluzione non taglierà le parole, aggiungerà tre punti dopo il primo spazio. Ho modificato la soluzione @ Raccoon29 e ho sostituito tutte le funzioni con le funzioni mb_ in modo che funzionasse per tutte le lingue come l'arabo
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;
Se non vi sono requisiti rigidi sulla lunghezza della stringa troncata, è possibile utilizzarla per troncare e impedire anche il taglio dell'ultima parola:
$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, " ")));
In questo caso, $preview
lo sarà "Knowledge is a natural right of every human being"
.
Esempio di codice live: http://sandbox.onlinephpfunctions.com/code/25484a8b687d1f5ad93f62082b6379662a6b4713