Creare automaticamente l'introduzione di un testo
Spesso i siti web che contengono notizie, articoli e documenti di varia natura mostrano nella pagina principale una breve introduzione di questi contenuti che rimanda all’articolo completo. In molti casi questa introduzione viene scritta dallo stesso autore oppure è ottenuta prendendo i primi caratteri dell’articolo completo. Vediamo come realizzare questa tecnica cercando di renderla più raffinata.
Il nostro scopo è quello di individuare il punto in cui è più opportuno tagliare il testo dell’articolo così da ottenere una introduzione. Per fare ciò cerchiamo tutte le interruzioni di frase, individuabili dalla presenza di un punto e di uno spazio, segno di tabulazione o carattere di fine riga.
Supponendo di voler generare introduzioni con una determinata lunghezza media, cerchiamo quindi l’interruzione di frase più prossima a questa lunghezza e ne memorizziamo la posizione. Fatto ciò non ci resta che estrarre una sottostringa dalla stringa originale fermandoci alla posizione appena calcolata.
L’esempio che segue realizza la procedura descritta:
<?php
$frase = "Questa è un articolo molto lungo.\nUna frase\n".
"a cavallo. Voglio riuscire a estrapolarne una introduzione.\n".
"Deve essere lunga circa 150 caratteri. ".
"Frase uno.\n Frase 2. Frase 3.";
echo creaIntro($frase, 150);
function creaIntro($frase,$numero_di_caratteri)
{
// cerco i punti in cui terminano le frasi
preg_match_all("/(\.\s)+/",$frase,$out,PREG_OFFSET_CAPTURE);
// cerco l'interruzione più vicina a $numero_di_caratteri
$minima_distanza = strlen($frase);
$offset_minima_distanza = false;
foreach ($out[0] as $offset) {
$distanza = abs($numero_di_caratteri - $offset[1]);
if($distanza < $minima_distanza) {
$minima_distanza = $distanza;
$offset_minima_distanza = $offset[1];
}
}
if($offset_minima_distanza) {
// restituisco l'introduzione some sottostringa
// di lunghezza $offset_minima_distanza + 1
echo substr($frase, 0, $offset_minima_distanza + 1);
} else {
// se non ho trovato una interruzione restituisco tutta la frase
echo $frase;
}
}
?>
Poiché la procedura non è velocissima a causa dell’espressione regolare si potrebbe pensare di memorizzare la variabile $offset_minima_distanza ovvero il punto in cui viene effettuato il “taglio” dell’introduzione in modo da non doverlo ricalcolare ad ogni nuova visualizzazione.