Per salvare il codice HTML di una pagina web, in PHP esiste la comoda funzione file_get_contents(), compatibile con PHP 4 e 5.

Si tratta di una funzione molto semplice, in grado di leggere il contenuto di un file e memorizzarlo dentro una stringa. I dati vengono codificati in UTF-8, ma è possibile cambiare il charset.

Può leggere sia file di testo che file binari, e permette di personalizzare gli HTTP headers creando uno stream context con la funzione stream_context_create().

In questo articolo scopriamo tutti i dettagli e vediamo alcuni esempi…

Requisiti e Soluzioni ai problemi

Per recuperare il contenuto di un file a partire da un URL esterno, deve essere abilitata la direttiva allow_url_fopen sul server. Esegui l’istruzione phpinfo() per conoscere la configurazione di Apache e, se necessario, modifica il file httpd.conf.

Se queste impostazioni non sono corrette, la funzione file_get_contents() non funzionerà come voluto.

Salvare codice HTML di una pagina web

Niente di più semplice… due righe di codice e il gioco è fatto:

$url = "http://www.google.it/";
$homepage = file_get_contents($url);
 
$file_to_update = "./webpages/my_google_web_page.html";
if(!file_exists($file_to_update)) {
    $stream = fopen($file_to_update, "w");
    fwrite($stream, $homepage);
    fclose($stream);
}

Nell’esempio sopra riportato, ho “rubato” l’homepage di Google e l’ho salvata nel file my_google_web_page.html. Potete personalizzare lo script secondo le vostre esigenze.

Modificare gli headers HTTP

Possiamo anche modificare gli headers HTTP prima di effettuare la chiamata con file_get_contents(). Vediamo il codice e poi lo commentiamo:

// Creo la struttura stream
$opts = array(
  'http'=>array(
    'method'=>"GET",
    'header'=>"Accept-language: it\r\n" .
              "Content-Type: text/html; charset=iso-8859-1\r\n"
  )
);
// Genero il context stream
$context = stream_context_create($opts);
 
// Effettuo la richiesta utilizzando gli headers HTTP personalizzati
$file = file_get_contents('http://www.google.it/', false, $context);

Anche in questo caso ho utilizzato San Google come cavia… La prima istruzione è la più importante, perchè ci permette di modificare l’header da utilizzare nella richiesta.

Possiamo impostare il tipo di richiesta (GET o POST) e aggiungere qualsiasi configurazione all’header HTTP (Content-language, Content-length, Cache-Control, etc.)

Successivamente, con la funzione stream_context_create(), creiamo l’oggetto stream da passare alla funzione interessata. Il parametro false nella chiamata alla funzione file_get_contents() serve ad indicare che non vogliamo specificare alcun flag.

Leggere solo una parte di un file

La funzione file_get_contents(), che finora abbiamo utilizzato per ricavare il codice HTML completo di una pagina web, ci permette anche di leggere una sequenza di caratteri, a partire da un offset.

// Legge 14 caratteri a partire dal 21° carattere
$section = file_get_contents('http://www.google.it/', NULL, NULL, 20, 14);

Elaborare il documento HTML

Dopo aver salvato il codice HTML della pagina, possiamo elaborare le informazioni a nostro piacimento. Ad esempio, potremmo voler ricavare i meta tag… allo scopo possiamo utilizzare le espressioni regolari:

$file_to_update = "./webpages/my_google_web_page.html";
 
if(file_exists($file_to_update)) {
    $stream = file_get_contents($file_to_update);
 
    if (preg_match("/<title>(.*)<\/title>/", $source, $meta_tit) && preg_match("/<meta name=\"description\" content=\"(.*)\" \/>/", $source, $meta_des)) {
	echo "title: " . $meta_tit[1] . "<br />";
	echo "description: " . $meta_des[1];
}
}

Nell’esempio ho utilizzato la funzione file_get_contents() per aprire il file salvato in precedenza… ho utilizzato la funzione preg_match() per cercare con le regular expressions i meta tag title e description. Ho recuperato il loro valore e l’ho visualizzato.

Conclusioni

Abbiamo visto che la funzione file_get_contents() ci permette di salvare il codice di una pagina web a partire dal suo URL. Può essere codice HTML, XML, testo, o qualsiasi altra cosa.

Ovviamente recupera il codice “visibile” e non le istruzioni lato server che generano la pagina di partenza.

Ti è piaciuto l'articolo? Vota Ok oppure No. Grazie Mille!
Condividi la notizia su Facebook e Twitter. Grazie Mille!
Condividi su Facebook Condividi su Twitter Condividi su Delicious Condividi su Digg