Validace HTML vstupu

Lukas Svoboda xsvobod4 na fi.muni.cz
Pondělí Únor 28 16:56:19 MET 2005


On Mon, Feb 28, 2005 at 04:22:46PM +0100, Jan Kasprzak wrote:
> 	Dobry den,
> 
> cim byste validovali vstup uzivatele takovy, ze ma byt
> zaclenitelny do XHTML kodu a ma obsahovat jen mnou povolene HTML tagy
> s povolenymi atributy? Idealne neco, co by bylo schopno i "upravit"
> chybejici parove tagy a podobne. Predstavuju si neco, co by ze vstupu
> 
> <A HREF="..." TARGET=_blank>text <b>tucny</B></A><BR>Jiny text
> 
> udelalo
> 
> <a href="...">text <b>tucny</b></a><br />Jiny text
>...

uz jsem v perlu pres rok nedelal a nevim jestli existuje nejaka vhodna
knihovna, ale naspal bych to asi nejak nasledovne...

PS
Tedy je to jen ukazka, ale doufam, ze uz demonstruje vse...
Bude chtit upravit jestli ma nebo nema vkladat text u neznameho tagu,
space znak na konci atributu (asi pres pole a join) a pripadne testovani
jestli je spravne vynorovani z vnorenych tagu, pres nejake pole jak je
zanoroval (jestli to nedela sam HTML::Parser), rikam uz jsem v Perlu
dlouho nedelal.

use strict;

require HTML::Parser;


package Validate;

use vars qw(@ISA);

@ISA = qw(HTML::Parser);


our %povolenTag = ( 'A' => 1);
my %povolenAttr = ( 'A' => {'HREF' => 1 } );

sub new {
    my $this = shift;
    my $class = ref($this) || $this;

    my $self = $this->SUPER::new();
    $self->{TEXT} = "";
    return bless($self,$class);
}

		 

sub start() {
    my($self,$tag,$attr,$attrseq,$orig) = @_;
    $tag = uc($tag);
    return unless (defined $povolenTag{$tag});

    $self->{TEXT} .= "<$tag ";
    for (keys %{$attr} ) {
	    $self->{TEXT} .= "$_=\"$attr->{$_}\" " if ($povolenAttr{$tag}{uc($_)});
    }
    $self->{TEXT} .= ">";
}



sub text() {
    my ($self,$text) = @_;
    $self->{TEXT} .= $text;
}

sub end() {
   my ($self,$tag) = @_;
   $tag = uc($tag);
   $self->{TEXT} .= "</$tag>" if defined $povolenTag{$tag};
}

1;

__END__

package Main;

my $a = new Validate;
$a->parse('testuji <b> nic <b> <a HrEf="ble">url</a> konec');
print $a->{TEXT};




Další informace o konferenci Perl