Hi Wolfgang,
Wer hat Ideen?
Ich glaube nicht, dass das nur mit einem Regex zu lösen ist. Wenn es geht, wird das auf jeden Fall sehr umständlich.
Aber es sollte gehen, wenn du einen kleinen Parser baust. Ich hab das gemacht, weil ich anfangs dachte, es müsste doch irgendwie mit einem regex gehen, hab es aber dann doch so wie folgend gemacht.
########xwolf_regex.pl########
#!/usr/bin/perl -w
use strict;
use Data::Dumper;
my $string='<name="wert2" value2="dies ist ein "gequoteteter" <h1>H1</h1>-Text, mit HTML in sich.">';
my $test= parse_string($string);
print Dumper $test;
sub parse_string{
my $string=shift;
my $status;
$status->{value_started}=0;
$status->{save_name}=1;
$status->{save_value}=0;
$status->{current_value}='';
$status->{current_name}='';
$status->{backtrace}='';
while ($string=~m/(.)/g){ #Zeichenweise durchgehen. Könnte man besser mit einem Array machen, weis aber ehrlichgesagt nicht mehr, wie ich schnell einen string(perl) in ein Array verwandle.
if ($1 eq '='){
$status->{save_value}=1;
$status->{save_name}=0;
}
elsif ($1 eq '"'){
if ($status->{backtrace} eq '\'){
$status->{current_value}.=$1;
}
elsif($status->{value_started}==1){
$status->{save_value}=0;
$status->{save_name}=1;
$status->{value_started}=0;
$status->{values}->{$status->{current_name}}=$status->{current_value};
$status->{current_name}='';
$status->{current_value}='';
}
else{
$status->{save_name}=0;
$status->{save_value}=1;
$status->{value_started}=1;
}
}
elsif ($1 eq ' ' and $status->{value_started}!=1){
}
elsif ($status->{value_started}!=1 and ($1 eq '<' or $1 eq '>')){
}
else{
if ($status->{save_value}==1){
$status->{current_value}.=$1;
}
elsif ($status->{save_name}==1){
$status->{current_name}.=$1;
}
}
$status->{backtrace} = $1;
}
return %$status->{values};
}
######EOF#####
Ich denke mal so müsste es gehen. Allerdings hab ich das jetzt nicht ausführlich getestet, dh, da dürften sich noch einige Fehler verbergen. Auch werden momentan mehrfach vorkommende Attribute einfach überschrieben, was man aber dadurch beheben könnte, dass man die Ergebnisse nicht in einem Hash sondern einem Array speichert.
Falls du ausführlichere Komentare wünscht, ist das kein Problem, nur will ich jetzt erst mal was essen.
Grüße Andres Freund