[Cascavel-pm] Pegar conteudo interno de uma tag.

Adriano Ferreira a.r.ferreira em gmail.com
Quarta Agosto 23 10:21:33 PDT 2006


On 8/23/06, Luis Motta Campos <monsieur_champs em yahoo.com.br> wrote:
> Joenio Marques wrote:
> > Outra opção é utilizar regex
> >
> > ($mensagem) = $string =~ m/<!\[CDATA\[(.+?)\]\]>/io;
> >
> > Neste caso voce perde algumas vantagens por não utilizar um parser
> > como XML::Twig. Se tiver interesse ou já for familiarizado com a
> > especificação DOM, procure por XML::DOM no CPAN.
>
>   Monges, vamos cantar este mantra:
>
>   Nunca use regular expressions para tratar XML.
>   Nunca use regular expressions para tratar XML.

Nunca use regular expressions para tratar XML.
Nunca use regular expressions para tratar XML.

Vamos lá. Todos juntos com o monsieur champs. Tudo que tem uma
gramática mais complicada que um monte de regras léxicas merece
respeito e, para nosso próprio bem, não deve ser processado apenas
através de expressões regulares.

Você pode achar que funciona no início, mas logo vai ter que começar a
sofisticar a regex até que ela não caiba mais em si e você não entenda
mais o que ela faz.

Exemplo: a expressão do Joênio não cuida de CDATA com mais de uma linha:

$ perl -e 'my $string = <<XML;
 <![CDATA[mensagem com
 duas linhas]]>
XML

($mensagem) = $string =~ m/<!\[CDATA\[(.+?)\]\]>/io; print $mensagem;
 '
(silêncio)

O que pode ser resolvido com um modicador /s, mais isto não vai acabar
mais. Quer ver?
Se o XML for esse:

    <?xml version='1.0' ?>
    <xml>

    <!--
     <![CDATA[mensagem com
     duas linhas]]>
    -->

    </xml>

a expressão aumentada com o /s vai te entregar uma coisa que não é o
conteúdo de um CDATA, pois ele estava dentro de um comentário XML. E
por aí vai. Vivam os parsers XML para interpretar XML!

Adriano Ferreira.


Mais detalhes sobre a lista de discussão Cascavel-pm