2009-02-22 15 views
21

Ecco una domanda veloce Perl:Come posso decodificare le entità HTML?

Come posso convertire HTML caratteri speciali come ü o ' normale testo ASCII?

ho iniziato con qualcosa di simile:

s/\&#(\d+);/chr($1)/eg; 

e potrebbe scrivere per tutti i caratteri HTML, ma qualche funzione in questo modo probabilmente già esiste?

Nota che non è necessario un convertitore di testo HTML-> completo. Ho già analizzato l'HTML con lo HTML::Parser. Ho solo bisogno di convertire il testo con i caratteri speciali che sto ottenendo.

risposta

47

Date un'occhiata a HTML::Entities:

use HTML::Entities; 

my $html = "Snoopy & Charlie Brown"; 

print decode_entities($html), "\n"; 

Potete immaginare l'uscita.

+1

Per coloro a cui piacciono gli interni una CLI: 'perl -MHTML :: Entità -le 'stampa decode_entities (" & iquest; ' ")' –

3

Esistono una serie di entità HTML predefinite - &"> e così via - che è possibile inserire codice.

Tuttavia, il caso più grande di entità numberic - { - sarà molto più difficile, in quanto tali valori sono Unicode, e la conversione in ASCII sta per variare da difficile-impossibile.

+0

Giusto, Bevan. Non esiste una retro-traduzione da Unicode a "plain ASCII". Joel ha scritto un ottimo articolo sulle codifiche del testo, dehmann dovrebbe leggerlo ... – AmbroseChapel

+1

http://www.joelonsoftware.com/articles/Unicode.html 'Tutto ciò che riguarda "plain text = ascii = caratteri sono 8 bit" è non solo sbagliato, è irrimediabilmente sbagliato, e se stai ancora programmando in quel modo, non sei molto meglio di un medico che non crede ai germi ". – AmbroseChapel

+1

Perl: ... rendendo le cose difficili possibili – daxim

6

Nota che ci sono anche caratteri esadecimali. Sembrano così: & # xe9; (é).

Utilizzare HTML :: Entità 'decode_entities per tradurre le entità in caratteri reali. Per convertirlo in ASCII è necessario più lavoro. Ho usato iconv (interfaccia perl: Text :: Iconv) con l'opzione di traslitterazione attivata con qualche successo in passato. Ma se hai a che fare con con un insieme limitato di entità, o non hai realmente bisogno di ridurle a equivalenti ASCII, potresti stare meglio limitando ciò che produce decode_entities o fornendogli mappe di conversione personalizzate . Vedi il documento HTML :: Entities.

20

Le risposte precedenti spiegano come decodificare le entità in stringhe Perl, ma è stato anche chiesto come modificarle in ASCII.

Supponendo che questo è davvero ciò che si vuole e non si desidera che tutti i caratteri Unicode è possibile guardare il modulo Text::Unidecode da CPAN fare zapping tutti quei personaggi strani di nuovo in un insieme più o meno simile di caratteri ASCII:

use Text::Unidecode qw(unidecode); 
use HTML::Entities qw(decode_entities); 

my $source = '北亰'; 
print unidecode(decode_entities($source)); 

# That prints: Bei Jing