2009-02-22 14 views
21

He aquí una pregunta rápida Perl:¿Cómo puedo decodificar entidades HTML?

¿Cómo puedo convertir caracteres especiales HTML como ü o ' al texto ASCII normal?

empecé con algo como esto:

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

y podrían escribir para todos los caracteres HTML, pero alguna función como esto probablemente ya existe?

Tenga en cuenta que no necesito un convertidor HTML-> Text completo. Ya analizo el HTML con el HTML::Parser. Solo necesito convertir el texto con los caracteres especiales que obtengo.

Respuesta

47

Tome un vistazo a HTML::Entities:

use HTML::Entities; 

my $html = "Snoopy & Charlie Brown"; 

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

Se puede adivinar la salida.

+1

Para aquellos a los que les gusta el CLI one liners: 'perl -MHTML :: Entidades -le 'imprimir decode_entities (" & iquest; ' ")' –

3

Hay un puñado de entidades HTML predefinidas - &"> y así sucesivamente - que podría codificar.

Sin embargo, el caso más grande de entidades Numberic - { - va a ser mucho más difícil, ya que esos valores son Unicode, y la conversión a ASCII va a variar de difícil a imposible .

+0

Muy bien, Bevan. No existe una retrotraducción de Unicode a "ASCII sin formato". Joel escribió un muy buen artículo sobre codificaciones de texto, dehmann debería leerlo ... – AmbroseChapel

+1

http://www.joelonsoftware.com/articles/Unicode.html 'Todo eso sobre' texto plano = ascii = los caracteres son 8 bits 'es no solo está mal, es irremediablemente incorrecto, y si todavía estás programando de esa manera, no eres mucho mejor que un médico que no cree en los gérmenes ". – AmbroseChapel

+1

Perl: ... haciendo que las cosas difíciles sean posibles – daxim

6

Tenga en cuenta que también hay caracteres hexadecimales especificados. Se ven así: & # xe9; (é).

Utilice las :: decode_entities de HTML :: Entities para traducir las entidades en caracteres reales. Convertir eso a ASCII requiere más trabajo. He usado iconv (interfaz perl: Text :: Iconv) con la opción de transliterar con éxito en el pasado. Pero si está tratando con un conjunto limitado de entidades, o si realmente no lo necesita reducido a equivalentes ASCII, , será mejor que limite lo que produce decode_entities o proporcione mapas de conversión personalizados . Ver el HTML :: Entidades doc.

20

Las respuestas anteriores le dicen cómo decodificar las entidades en cadenas Perl, pero también preguntó cómo cambiarlas a ASCII.

Suponiendo que esto es realmente lo que quiere y no quiere que todos los caracteres Unicode que puede mirar en el módulo de CPAN Text::Unidecode a Zap todos esos personajes extraños de nuevo en una colección más o menos similar de caracteres ASCII:

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

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

# That prints: Bei Jing 
Cuestiones relacionadas