Como posso decodificar entidades HTML?
-
05-09-2019 - |
Pergunta
Aqui está uma pergunta rápida do Perl:
Como posso converter personagens especiais HTML como ü
ou '
para texto ASCII normal?
Comecei com algo assim:
s/\&#(\d+);/chr($1)/eg;
E poderia escrevê -lo para todos os personagens HTML, mas algumas funções como essa provavelmente já existem?
Observe que não preciso de um conversor de texto HTML-> completo. Eu já analisei o html com o HTML::Parser
. Eu só preciso converter o texto com os chars especiais que estou recebendo.
Solução
Dar uma olhada em Html :: entidades:
use HTML::Entities;
my $html = "Snoopy & Charlie Brown";
print decode_entities($html), "\n";
Você pode adivinhar a saída.
Outras dicas
As respostas acima dizem como decodificar as entidades em cordas perl, mas você também perguntou como transformá -las ASCII.
Supondo que seja realmente isso que você quer e não quer todos os caracteres unicode, você pode olhar para o Texto :: unidecode Módulo de CPAN para Zap todos esses personagens estranhos de volta a uma coleção aproximadamente semelhante 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
Observe que também existem caracteres especificados por hexadecipal. Eles se parecem com o seguinte: É (É).
Use HTML :: Entidades Decode_entities para traduzir as entidades em caracteres reais. Para converter isso em ASCII, requer mais trabalho. Eu usei o ICONV (interface Perl: text :: iconv) com a opção Transliterate com algum sucesso no passado. Mas se você estiver lidando com um conjunto limitado de entidades, ou na verdade não precisará que ele seja reduzido a equivalentes ASCII, pode ser melhor limitar o que o decode_entities produz ou fornecendo -o com mapas de conversão personalizados. Veja o html :: entidades doc.
Há um punhado de entidades HTML predefinidas - &
"
>
E assim por diante - que você poderia codificar.
No entanto, o maior caso de entidades numéricas - {
- vai ser muito mais difícil, pois esses valores são Unicode, e a conversão para ASCII vai variar de difícil para impossível.