Schrift
[thread]8947[/thread]

Text Parsen

Leser: 1


<< >> 4 Einträge, 1 Seite
sid burn
 2007-04-26 16:22
#76244 #76244
User since
2006-03-29
1520 Artikel
BenutzerIn

user image
Hi,
mal wieder ich. ;)

Ich habe folgende Aufgabe:
In einer Variable steht ein kompletter Text. Dieser Text enthälz zusätzlich HTML Elemente. Ist aber kein komplett gültiger HTML Code. Also kein <html> <body> Tags etc. Weiterhin sind Newline Zeichen im text enthalten.

Die Aufgabe ist nun alle Newline Zeichen in <br /> umzuwandeln. Okay das ist nicht das Problem.

Als Bediengung gilt allerdiengs das Newline Zeichen innerhalb von tabellen nicht in Newline Zeichen umgewandelt werden sollen. Auser wenn das Newline Zeichen innerhalb eines <td> oder <th> feldes vorkommt soll es wieder in ein <br /> umgewandelt werden.

Bisher habe ich diese Aufgabe z.B: folgendermaßen gelöst:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
my $in_table = 0;
my $in_td = 0;
my $in_th = 0;
while (not $text =~ m/\G\z/gc) { # Noch kein Ende erreicht
if ( $text =~ m/\G<\s*table\b/igc ) { $in_table++ } # Wenn in table dann var incr
elsif ( $text =~ m/\G<\s*td\b/igc ) { $in_td++ } # wenn in td dann var incr
elsif ( $text =~ m/\G<\s*th\b/igc ) { $in_th++ } # wenn in th dann var incr
elsif ( $text =~ m{\G</\s*td\s*>}igc ) { $in_td-- } # wenn td verlassen dann var decr
elsif ( $text =~ m{\G</\s*th\s*>}igc ) { $in_th-- } # wenn th verlassen dann var decr
elsif ( $text =~ m/\G(?=\n)/gc ) { # Wenn ein Newline kommt...
$text =~ s{\G\n}{<br />} if not $in_table;
$text =~ s{\G\n}{} if $in_table && not ($in_td || $in_th);
$text =~ s{\G\n}{<br />} if $in_table && ($in_td || $in_th);
}
else { $text =~ m/\G./igcs } # Regex Engine ein Zeichen weiter Setzen
}


Das Funktioniert zwar alles, aber ich finde es doch ziemlich umständlich.

Gibt es irgendwie andere, bessere Möglichkeiten solch einen Text zu Parsen und dann auch nach belieben abzuändern? Optimal finde ich meine Lösung nicht auch wenn sie erstmal Funktioniert. Das erkennen der HTML Tags ist ja ansonsten auch ziemlich einfach gehalten.\n\n

<!--EDIT|sid burn|1177590574-->
Nicht mehr aktiv. Bei Kontakt: ICQ: 404181669 E-Mail: perl@david-raab.de
tolgale
 2007-04-26 17:09
#76245 #76245
User since
2007-04-24
22 Artikel
BenutzerIn
[default_avatar]
mit einer switch-verzweigung würde das ganze vielleicht besser ausschauen ( über einen Label in verbindung mit der last-anweisung oder use switch; ).
$nobody==$perfect?$everybody==nobody$:$everybody==$perfect; # <(^^,)>
bloonix
 2007-04-26 19:05
#76246 #76246
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
Sorry... klappt vielleicht nicht so supi, aber zumindest bei diesem Beispiel:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
use strict;
use warnings;

my $add  = 0;
my $text = do { local $/, <DATA> };

for my $line (split /\n/, $text) {
  print $line;
  if ($line =~ m@<\s*/\s*t[dh]@) {
     $add = 0;
  } elsif ($line =~ m@<\s*t[dh]@) {
     $add = 1;
  }
  print $add ? '<br>' : "\n";
}

__END__
<html>
<head>
  <title>test</title>
</head>
<body>
<table>
  <tr>
     <th>header1</th>
     <th>header2
foo bar
foobar
</th>
  </tr>
  <tr>
     <td>column1
foo bar
foobar
</td>
     <td>column2</td>
  </tr>
</table>
</html>


Output:

<html>
<head>
<title>test</title>
</head>
<body>
<table>
<tr>
<th>header1</th>
<th>header2<br>foo bar<br>foobar<br></th>
</tr>
<tr>
<td>column1<br>foo bar<br>foobar<br></td>
<td>column2</td>
</tr>
</table>
</html>
\n\n

<!--EDIT|opi|1177600043-->
What is a good module? That's hard to say.
What is good code? That's also hard to say.
One man's Thing of Beauty is another's man's Evil Hack.
ptk
 2007-04-26 23:06
#76247 #76247
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
[quote=tolgale,26.04.2007, 15:09]mit einer switch-verzweigung würde das ganze vielleicht besser ausschauen ( über einen Label in verbindung mit der last-anweisung oder use switch; ).[/quote]
Bitte nicht. use Switch ist total buggy. Besser ist es, auf perl5.10.0 zu warten und given/when zu verwenden.
<< >> 4 Einträge, 1 Seite



View all threads created 2007-04-26 16:22.