Schrift
[thread]6779[/thread]

html-tags per regex entfernen

Leser: 1


<< >> 8 Einträge, 1 Seite
Quenten
 2005-03-10 17:55
#52521 #52521
User since
2005-02-15
22 Artikel
BenutzerIn
[default_avatar]
Hi Leute,
ich bräuchte nen regulären Ausdruck, der mir aus ner Mail die HTML-Tags rauslöscht.

Ich hatte es mal so probier:
Code: (dl )
$body =~ s/<.+?>//g;
aber das Problem ist bei Tags, die Zeilenumbrüche mitendrin enthalten, also...
<!-- jofjodf
dfadf
sdfsdf
-->

Wäre klassen, wenn da einer ne Idee hätte.
cu, quenten
Strat
 2005-03-10 18:02
#52522 #52522
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
wenn du alles (inkl. Zeilenumbrueche) in einer skalaren Variable hast, kannst du mit dem Parameter /s bei einer regex angeben, dass Zeilenumbrueche auch zur Klasse . gehoeren...

allerdings ist es nicht wirklich sicher, html-code mit regulaeren ausdruecken zu leibe zu ruecken, es sei denn, man haette ihn selbst erstellt. bei fremden quellen sieht der teilweise aus wie hund ganz hinten, und da fallen dann die schoensten Regulaeren ausdruecke auf die nase... bei deinem z.B. waere schon folgendes fatal:
Code: (dl )
1
2
3
<! Das >-Zeichen sollte man besser escapen -->
# oder:
<input type="button" value="--->" name="Knopf">


besser eins der HTML:: Module verwenden, z.B. HTML::Parser...\n\n

<!--EDIT|Strat|1110470584-->
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
Quenten
 2005-03-14 18:41
#52523 #52523
User since
2005-02-15
22 Artikel
BenutzerIn
[default_avatar]
Jo, danke. Bin gerade mal am Rumprobieren, wie ich das Modul am besten auf meine Bedrüfnisse anpasse.

Ein weiteres Problem, was ich gerade feststelle habe, ist, wenn in der Mail (also im body) jemand zufällig Quellcode geschrieben hat, wird dieser natürlich gleich mit ersetzt bzw. gesplittet. :rock:\n\n

<!--EDIT|Quenten|1110819529-->
esskar
 2005-03-14 18:51
#52524 #52524
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
ersetz doch einfach < durch &lt; und > durch &gt;
oder zeige den txt part der mail ein; wenn dieser nicht existiert, geht auch wohl folgendes
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
package Sources::HtmlParser;

use strict;
use warnings;

use base 'HTML::Parser';

sub parseText
{
my($self, $text) = @_;

$self->{mytext} = "";
$self->parse($text);
}


sub text
{
my($self, $origtext, $is_cdata) = @_;

$self->{mytext} .= $origtext;

1;
}

sub get_text
{
my($self) = @_;

return $self->{mytext};
}

1;

my $hp = Sources::HtmlParser->new();
$hp->parseText($httpbody);
$httpbody = HTML::Entities::decode_entities($hp->get_text);
$httpbody =~ s/<!--.+?-->//gms;
Quenten
 2005-03-14 19:13
#52525 #52525
User since
2005-02-15
22 Artikel
BenutzerIn
[default_avatar]
Ich muss ehrlich gestehen, dass mir dein Eintrag rein gar nichts gebracht hat, sorry.
Ich merk jedenfalls, dass ich auf den Gebiet noch ziemlich nachholbedarf habe und auch objektorientiert programmieren mache ich nur sehr sehr selten.

Was ist das für ein Packet/Modul?
package Sources::HtmlParser;

Und das hier klappt doch nur, wenn es ausschließlich ein Entity gibt!?
HTML::Entities::decode_entities($hp->get_text);


Was ich eigentlich vorhabe ist:
1. eMail einlesen
2. mittles MIME-Tools (MIME::Parser) parsen und auseinandernehmen
bis hier hin klappt alles soweit schon
3. den body von HTML-Tags befreien, aber nur vor und nach dem haupttext. der mail-text ansich dürfte ja ruhig html-code und sonstiges enthalten. also müsste ich den body in 3 teile splitten (html-vorher, body, html-nachher).
Quenten
 2005-03-16 17:06
#52526 #52526
User since
2005-02-15
22 Artikel
BenutzerIn
[default_avatar]
Habe nun ein Script, dass seinen Dienst tut und mitterweile verstehe ich auch die Verzweigungen mit der Klasse. Danke an alle die geholfen haben.

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
use HTML::Parser;
my $parser = HTML::Parser->new(
start_h => [ \&_starttag, 'self, tagname, attr' ],
end_h => [ \&_endtag, 'self, tagname' ],
text_h => [ \&_text, 'self, dtext' ]
);

$parser->parse($email_text);

sub _starttag {
my ($self, $tag, $attr) = @_;
$self->{'_body'} = 1 if($tag eq 'body');
}

sub _endtag {
my ($self, $tag) = @_;
$self->{'_body' } = 0 if($tag eq 'body' );
}

sub _text {
my ($self, $dtext) = @_;

$dtext =~ s/\A\s+//;
$dtext =~ s/\s+\z//;
return() unless ( length($dtext) > 0 and $dtext =~ /[^\s]/ );

if ($self->{'_body'} == 1) {
print $dtext;
}
}
\n\n

<!--EDIT|Quenten|1110985600-->
Quenten
 2005-03-16 18:04
#52527 #52527
User since
2005-02-15
22 Artikel
BenutzerIn
[default_avatar]
Ha, wie geil. Ich hab gerade noch was viel einfacheres gefunden.
Das Buch "Effektives Programmieren mit Perl 5" (ISBN 3-8273-1095-4) ist einfach genial.

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#!/usr/bin/perl -w

use strict;
use warnings;
use HTML::FormatText;
use HTML::Parse;

my $html;
my $formatter;


$html = HTML::Parse::parse_htmlfile("beispiel.html");
# alternativ ginge auch... $html = HTML::Parse::parse_html($text);
# ...um den HTML-Text aus einer Variablen zu holen

$formatter = HTML::FormatText->new();

print $formatter->format($html);
esskar
 2005-03-16 19:43
#52528 #52528
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
danke, letzteres kannte ich noch nicht!
<< >> 8 Einträge, 1 Seite



View all threads created 2005-03-10 17:55.