L'utilizzo dell’estensione Tidy (Parte I)

Pagina 1 di 3

Tidy appartiene al gruppo di quelle estensioni di PHP a cui vale la pena dedicare un attimo di attenzione. Tidy può aiutarci in modo significativo sia nella creazione di codice HTML, sia nella verifica di dati che provengono dall’esterno.

Tidy è il nome della nuova estensione PHP creata da John Coggeshall (http://www.coggeshall.org/). Con il suo utilizzo è possibile diagnosticare, pulire e riparare difettosi documenti HTML, XHTML e XML. In più è possibile usare un parser  HTML che permette di creare l’albero DOM (Document Object Model) e di estrarre dei singoli elementi insieme agli attributi. Il modulo è destinato a PHP5 (Tidy 2.0), ma esiste comunque una versione per PHP 4.3.x (Tidy 1.0). Gli esempi presentati nell’articolo non funzioneranno correttamente nella versione più vecchia del modulo Tidy per il fatto che quest'ultima non supporta le funzioni descritte oppure accetta parametri diversi.

Le differenze tra Tidy nella versione 1.0 e 2.0

I cambiamenti più rilevanti rispetto alla versione 1.0 sono una migliore funzionalità, maggior velocità di funzionamento e l’oggettività. Tidy per PHP 4.3.x può essere eseguito su un solo file alla volta. Tidy 2.0 grazie al buffer PHP (ob_tidyhandler)  rende possibile il lavoro sull’albero degli indicatori HTML.

Da dove cominciare?

Prima di iniziare a lavorare con il modulo, occorre conoscerne le funzionalità. Creiamo un documento PHP con del codice HTML errato. Non badiamo ai tag non chiusi, alla mancanza dell’intestazione del documento o della dichiarazione DOCTYPE (vedi Listing 1). Utilizzando il buffer facciamo passare il codice per la funzione ob_tidyhandler. Questa funzione, trasmessa come argomento per ob_start, provoca l’analisi e la riparazione del buffer nel quale si trova il documento creato. In questo modo possiamo avere il codice corretto nella sua struttura,  interpretato correttamente da tutti i browser Internet.

<<LISTING lang=PHP posx=4;0l posy=t fit=W:114 grow=H>>

Listing 1. L’utilizzo del buffer nel collegamento con ob_tidyhandler

 

<?php

   ob_start('ob_tidyhandler');

   echo '<b>PHP Solutions</u><br>';

   echo '<a href=www.phpsolmag.org><u>clicca qui</a>';

?>

<</LISTING>>

 

È interessante il fatto che non solo sono stati riparati tutti gli errori, ma tutto il codice viene chiuso nel documento HTML con gli indicatori dell’intestazione e la parte principale del documento.

In pratica

Quando interagiamo con le form e gli utenti, di solito cancelliamo ogni contenuto pericoloso delle stringhe attraverso la funzione strip_tags o htmlspecialchars. Tuttavia alcuni tag HTML utilizzati adeguatamente possono risultare utili all'utente per formattare meglio il testo ( per esempio tramite la sottolineatura o usando il grassetto) oppure per inserire un link. In generale, questo potrebbe diventare codice non ottimizzato per la nostra pagina. Problemi del genere si verificano spesso nei forum di discussione o nei guestbook. Volendo rendere disponibile ad un utente la formattazione HTML dei testi, per esempio, di un messaggio su un forum, di solito utilizziamo un editor grafico scritto in DHTML. Cosa fare quando questa soluzione non ci soddisfa? Non possiamo fidarci ciecamente del navigatore e permettergli di inserire codice HTML, perché non saremo sicuri se ha davvero chiuso tutti gli indicatori (Disegno1).

Ovviamente possiamo creare un nostro analizzatore, ma a quale scopo se abbiamo Tidy? Con il suo utilizzo ripareremo il codice inviato da un pannello html, e la struttura del documento principale non cambierà.

Sul Listing 2 abbiamo un esempio dello script PHP che simula l’aggiunta di un nuovo messaggio ad un forum di discussione. Vediamolo da vicino.

<<LISTING lang=PHP posx=4;0l posy=t fit=W:114 grow=H>>

Listing 2. La riparazione del codice HTML inviato da un utente

 

<?php

 

   echo '<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 3.2//EN">';

   echo '<html><head><title>Listing 2.</title></head><body>';

   if (isset($_POST['message'])) {

      echo '<b>Il codice HTML inviato:</b><br />'

         .htmlspecialchars($_POST['message']).'<br /><br />';

      $_POST['message'] = strip_tags($_POST['message'], '<a><b><i><u><font>');

      $tidy = tidy_parse_string($_POST['message'], null, 'UTF8');

      tidy_clean_repair($tidy);

      //Qui dovrebbe verificarsi la scrittura del codice HTML riparato

      //per esempio al database. Noi inseriremo il sorgente riparato.

      echo '<b>Il codice HTML corretto:</b><br />';

      echo htmlspecialchars(substr(tidy_get_body($tidy)->value, 6, -10));

   }

   echo '<h3>Aggiungi post</h3>';

   echo '<form method="post" action="4.php5">';

   echo '<textarea name="message" rows="10" cols="50"></textarea><br />';

   echo '<input type="submit" value="OK" /></form>';

   echo '</body></html>';

 

?>

<</LISTING>>

 

Questo script riceve da un utente un testo qualsiasi, HTML compreso. La parte più importante del codice è nelle prime righe. All’inizio inseriamo il testo ricevuto in forma non modificata. Se vogliamo eliminare gli indicatori non desiderati, utilizziamo la funzione  strip_tags e lasciamo soltanto i tag responsabili della formattazione del testo e della creazione dei links. Adesso segue il primo utilizzo del modulo Tidy – l’avvio della funzione tidy_parse_string. Essa comporta la creazione dell’analizzatore Tidy, che è anche il valore restituito dalla funzione. Un argomento necessario di questa funzione è la variabile di tipo string che contiene il codice HTML con il quale lavoreremo. Altri due argomenti sono opzionali e descrivono, di seguito, l'array con le nostre opzioni di configurazione dell'analizzatore (di questo parleremo nel prossimo capitolo) e la codifica utilizzata per i caratteri. I valori permessi per il terzo argomento sono: ascii (il valore di base), latin1, raw, utf8, iso2022, mac, win1252, utf16le, utf16be, utf16, big5 e shiftjis. Dopo aver creato l’analizzatore richiamiamo la funzione tidy_clean_repair  con lo scopo di pulire e riparare il codice, e successivamente inseriamo la nuova sequenza eliminando prima i tag di apertura e di chiusura dell’indicatore body.

Continua >>>

Ti potrebbe interessare anche

commenta la notizia

C'è 1 commento
Redazione
Condividi le tue opinioni su questo articolo!