¿Cómo puedo decodificar entidades HTML?
-
05-09-2019 - |
Pregunta
Aquí hay una pregunta rápida de Perl:
¿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ía escribirlo para todos los caracteres HTML, pero algunas funciones como esta probablemente ya existe?
Tenga en cuenta que no necesito un convertidor de texto HTML-> completo. Ya analizo el HTML con el HTML::Parser
. Solo necesito convertir el texto con los caracteres especiales que recibo.
Solución
Echa un vistazo a Html :: entidades:
use HTML::Entities;
my $html = "Snoopy & Charlie Brown";
print decode_entities($html), "\n";
Puedes adivinar la salida.
Otros consejos
Las respuestas anteriores le dicen cómo decodificar las entidades en cadenas de perl, pero también le preguntó cómo cambiarlas a Ascii.
Suponiendo que esto es realmente lo que quieres y no quieres todos los personajes de Unicode que puedas ver el Texto :: unidecode Módulo de CPAN para Zap a todos esos personajes extraños nuevamente 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
Tenga en cuenta que también hay personajes especificados por hexadecimales. Se ven así: é (é).
Use html :: entidades decode_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 Transliterado con cierto éxito en el pasado. Pero si está tratando con un conjunto limitado de entidades, o en realidad no necesita que se reduzca a los equivalentes ASCII, puede ser mejor que limite lo que produce decode_entities o proporciona mapas de conversión personalizados. Ver el Doc HTML :: Entidades.
Hay un puñado de entidades HTML predefinidas - &
"
>
y así sucesivamente, que podrías código duro.
Sin embargo, el caso más grande de entidades numerarias - {
- va a ser mucho más difícil, ya que esos valores son Unicode, y la conversión a ASCII va a variar desde difícil a imposible.