Creare automaticamente l'introduzione di un testo

di Gianni Tomasicchio - 26 marzo 2005

Regex

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.

Effettua l'accesso o registrati per inserire un commento