In questa guida vedremo varie possibilità su come sia possibile troncare il testo utilizzando PHP.
Un problema comune quando si creano pagine web dinamiche (dove i contenuti provengono da un database, da content management system o da una sorgente esterna come ad esempio un feed RSS è che il testo di input può essere troppo lungo causando qualche problema con il layout della pagina.
Una soluzione è quella di troncare il testo in modo che esso si adatti alla pagina. Sembra semplice, ma spesso i risultati non sono come quelli previsti per il fatto che parole e frasi possono essere tagliate in punti non proprio appropriati.
Troncare il testo con PHP – Funzioni ed esempi
1. Limitare o troncare una stringa con PHP
Ecco una semplice funzione per troncare delle stringhe e che offre una certa flessibilità nella formattazione:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
// Original PHP code by Chirp Internet: www.chirp.com.au // Please acknowledge use of this code by including this header. function myTruncate($string, $limit, $break=".", $pad="...") { // return with no change if string is shorter than $limit if(strlen($string) <= $limit) return $string; // is $break present between $limit and the end of the string? if(false !== ($breakpoint = strpos($string, $break, $limit))) { if($breakpoint < strlen($string) - 1) { $string = substr($string, 0, $breakpoint) . $pad; } } return $string; } |
Per gli esempi riportati di seguito useremo il seguente paragrafo costituito da quattro frasi di diversa lunghezza:
1 2 3 |
$description = "The World Wide Web. When your average person on the street refers to the Internet, they're usually thinking of the World Wide Web. The Web is basically a series of documents shared with the world written in a coding language called Hyper Text Markup Language or HTML. When you see a web page, like this one, you downloaded a document from another computer which has been set up as a Web Server."; |
2. Troncamento al termine della frase (al punto)
L’azione predefinita è quella di troncare dopo il primo “.” (punto) successivo al limite di caratteri impostato ($limit). La stringa sarà interrotta con i carratteri ($pad) “…”
1 2 |
$shortdesc = myTruncate($description, 300); echo "<p>$shortdesc</p>"; |
1 2 |
$shortdesc = myTruncate($description, 200); echo "<p>$shortdesc</p>"; |
1 2 |
$shortdesc = myTruncate($description, 100); echo "<p>$shortdesc</p>"; |
3. Troncamento alle interruzioni di parola (agli spazi)
Se il testo è costituito da frasi lunghe o avete bisogno di un controllo preciso su tutta la lunghezza della stringa utilizzare l’interruzione sugli spazi delle parole potrebbe essere la soluzione migliore. L’intera frase potrebbe perdere un po di chiarezza ma con questo metodo tutte le parole restano intatte.
1 2 |
$shortdesc = myTruncate($description, 300, " "); echo "<p>$shortdesc</p>"; |
1 2 |
$shortdesc = myTruncate($description, 200, " "); echo "<p>$shortdesc</p>"; |
1 2 |
$shortdesc = myTruncate($description, 100, " "); echo "<p>$shortdesc</p>"; |
4. Troncamento dopo un numero di parole
Se si desidera semplicemente troncare il testo dopo un certo numero di parole, allora non sarà necessaria alcuna particolare funzione. Il seguente codice farà quanto richiesto:
1 2 3 |
$numwords = 10; preg_match("/(S+s*){0,$numwords}/", $description, $regs); $shortdesc = trim($regs[0]); |
Risultato:
Una simile ed alternativa funzione che inserisce anche il padding al troncamento della stringa basato sul numero di parole è la seguente:
1 2 3 4 5 6 7 |
function truncateWords($input, $numwords, $padding="") { $output = strtok($input, " n"); while(--$numwords > 0) $output .= " " . strtok(" n"); if($output != $input) $output .= $padding; return $output; } |
Che va utilizzata nel seguente modo:
1 2 |
$shortdesc = truncateWords($description, 10, "..."); echo "<p>$shortdesc</p>"; |
Il risultato sarà:
5. Chiudere i tags nella stringa troncata
Ovviamente la soluzione più semplice sarebbe quella di rimuovere tutti i tag dalla stringa per essere poi troncata, ma potrebbero esistere numerosi casi in cui questa soluzione non risulti ottimale.
Questa funzione accetta una stringa che contiene tag HTML e tenterà di chiudere automaticamente tutti i tag che sono stati lasciati aperti dal troncamento. Il presupposto al suo funzionamento è che il codice HTML oggetto della funzione sia valido e corretto prima della troncatura, in modo che tutti i tag risultanti aperti vengano chiusi in un ordine valido:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
// Original PHP code by Chirp Internet: www.chirp.com.au // Please acknowledge use of this code by including this header. function restoreTags($input) { $opened = array(); // loop through opened and closed tags in order if(preg_match_all("/<(/?[a-z]+)>?/i", $input, $matches)) { foreach($matches[1] as $tag) { if(preg_match("/^[a-z]+$/i", $tag, $regs)) { // a tag has been opened if(strtolower($regs[0]) != 'br') $opened[] = $regs[0]; } elseif(preg_match("/^/([a-z]+)$/i", $tag, $regs)) { // a tag has been closed unset($opened[array_pop(array_keys($opened, $regs[1]))]); } } } // close tags that are still open if($opened) { $tagstoclose = array_reverse($opened); foreach($tagstoclose as $tag) $input .= "</$tag>"; } return $input; } |