Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]372[/thread]

HTML-Code aus Zeichenkette entfernen



<< |< 1 2 >| >> 13 Einträge, 2 Seiten
Gast Gast
 2004-08-29 21:50
#3594 #3594
Hallo,

Ich habe mir ein Gästebuchscript geschrieben.
Nun möchte ich, außer <b></b> und <i></i> keine HTML-Tags zulassen.

Theoretisch müsste ich diese doch folgendermaßen rausfiltern:
$nachricht =~ s/<[^bi]>//gi;
$nachricht =~ s/<\/[^bi]>//gi;

Das funktioniert aber nicht. Egal was ich mache, er entfernt absolut kein HTML-Tag.

Kann mir jemand weiterhelfen ?

Danke schomal im vorraus.

Grüße

Matthias
coax
 2004-08-29 22:00
#3595 #3595
User since
2003-08-11
457 Artikel
BenutzerIn
[default_avatar]
probier's mal damit
Code: (dl )
$nachricht =~ s~</?[^bi]+?>~~gis;
\n\n

<!--EDIT|coax|1093802502-->
,,Das perlt aber heute wieder...'' -- Dittsche
MatthiasR
 2004-08-29 22:10
#3596 #3596
User since
2004-08-29
7 Artikel
BenutzerIn
[default_avatar]
Danke für die schnelle Antwort.

Aber es funzt auch nicht.
Ich habe ja so langsam das Gefühl, als ob er mit dem ^ nichts anfangen kann. lasse das Zeichen weg dann entfernt er mit nur den Fett und Kursiv-Tag.

Gibt es noch eine andere Möglichkeit ohne das ^ Zeichen ?

Grüße

Matthias
MatthiasR
 2004-08-29 22:17
#3597 #3597
User since
2004-08-29
7 Artikel
BenutzerIn
[default_avatar]
Also habe es jetzt mal auf eine Umständliche Art und Weise gemacht:

$nachricht =~ s/<([bi])>/\[_$1_\]/gi;
$nachricht =~ s/<\/([bi])>/\[_\/$1_\]/gi;
## <b> und <i> umwandeln in [_b_] ...

$nachricht =~ s/<.+?>//gi;
## alle html-Codes entfernen

$nachricht =~ s/\[_([bi])_\]/<$1>/gi;
$nachricht =~ s/\[_\/([bi])_\]/<\/$1>/gi;
## und das [_b_] ... wieder in html-code bringen.

Damit geht es wenigstens.
Aber es müsste doch auch mit [^bi] funktionieren ?!?!\n\n

<!--EDIT|MatthiasR|1093805082-->
[E|B]
 2004-08-29 22:28
#3598 #3598
User since
2003-08-08
2561 Artikel
HausmeisterIn
[Homepage] [default_avatar]
@MatthiasR

Zufall oder Wirklichkeit? :D
Willkommen auf Perl-Community.de!
Gruß, Erik!

s))91\&\/\^z->sub{}\(\@new\)=>69\&\/\^z->sub{}\(\@new\)=>124\&\/\^z->sub{}\(\@new\)=>);
$_.=qq~66\&\/\^z->sub{}\(\@new\)=>93~;for(@_=split(/\&\/\^z->sub{}\(\@new\)=>/)){print chr;}

It's not a bug, it's a feature! - [CGI-World.de]
MatthiasR
 2004-08-29 22:31
#3599 #3599
User since
2004-08-29
7 Artikel
BenutzerIn
[default_avatar]
Hallo Erik,

Tja, wo man sich überall trifft :-)

Solche sachen kotzen mich eben bei der Programmierung (egal welche Sprache) an. Theorie und Praxis sind grundverschieden ;-)

Grüße

Matthias
coax
 2004-08-29 23:00
#3600 #3600
User since
2003-08-11
457 Artikel
BenutzerIn
[default_avatar]
Das [^bi] wuerde nur Tags wie <a>,<c>..<h>,<j>..<z> entfernen. Also keine die mehrere Buchstaben beinhalten.
Meine Loesung wiederum wuerde nur die Tags herausloeschen die von vorne bis hinten kein b oder i im Namen enthalten, <head> waere so eins <body> und <table> jedoch nicht.
Ich kommm aber momentan auch auf keine angenehme RE-Loesung :(.

Grusz co(dermalwiedermehrueberRegExpslesensollte)ax.
,,Das perlt aber heute wieder...'' -- Dittsche
Dubu
 2004-08-30 02:21
#3601 #3601
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#!/usr/bin/perl
use strict;
use warnings;

my $message = <<EOT;
<p>Dies ist ein <b>Testtext in HTML</B>,
der <a href="link">einen Link</a> und <i>andere </i> Tags
enthalten soll. <br />
<img src="foo.png" alt="Foo" /> <img src="bar.png" alt="bar"></img>
</p>
EOT

$message =~ s~<([^bi]|/[^bi]|/?[^/>]{2,}/?)>~&lt;$1&gt;~gi;

# oder vielleicht so: (nur oeffnende Klammern ersetzen)

# $message =~ s~<(?!b>|i>|/b>|/i>)~&lt;~gi;


print $message;


Wie man sieht, kommt die zweite Variante besser mit einzelnen Kleiner- oder Groesserzeichen klar. Dafuer kann man mit der ersten Variante sehr einfach alles, was nach Tag aussieht, direkt loeschen (Ersetzungsteil einfach leer lassen).
MatthiasR
 2004-08-30 13:29
#3602 #3602
User since
2004-08-29
7 Artikel
BenutzerIn
[default_avatar]
Habe es mal ausprobiert und es funktioniert !!! Danke !!!

Aber ein paar Fragen habe ich noch:
Was beudetet bei der 2. Möglichkeit das '?!' ??
soweit ich weiß bezieht sich ein '?' auf ein vorheriges Zeichen (aber welches soll das sein), das '!' habe ich in diesem Zusammenhang aber noch nicht gesehen.

Kannst Du die 1. Möglichkeit bitte mal etwas genauer erläutern ?
Bis '<([^bi]|/[^bi]' verstehe ich es, aber danch hör ich nur noch ein lautes 'tuuuuuut' ;)

Grüße

Matthias\n\n

<!--EDIT|MatthiasR|1093858641-->
Crian
 2004-08-30 13:45
#3603 #3603
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
[quote=MatthiasR,29.08.2004, 20:31]Solche sachen kotzen mich eben bei der Programmierung (egal welche Sprache) an. Theorie und Praxis sind grundverschieden ;-)[/quote]
Nein, wo/was denn?


?! ist negative look ahead (null zeichen)
Man schaut halt, ob das was dort angegeben wird nicht folgt. Gefangen wird nichts.

Code: (dl )
s~<(?!b>|i>|/b>|/i>)~&lt;~gi


bedeutet:

Jede öffnende spitze Klammer, auf die weder b> noch i> noch /b> noch /i> folgt, wird durch &lt; ersetzt.

Zu

Code: (dl )
s~<([^bi]|/[^bi]|/?[^/>]{2,}/?)>~&lt;$1&gt;~gi


Man sucht nach einer spitzen öffnenden Klammer, auf die ein Zeichen folgt, das kein b und kein i ist oder auf die ein Slash und ein Zeichen folgt, das kein b und kein i ist oder auf die ein optionales Slash und mindestens zwei Zeichen, die weder Slash noch schließende spitze Klammer sind gefolgt von einem optionalen Slash folgt.

Code: (dl )
[^bi]|/[^bi]


liesse sich auch zu

Code: (dl )
/?[^bi]


zusammenfassen.

Damit hätte man dann zum Beispiel:

Code: (dl )
s~<(/?(?:[^bi]|[^/>]{2,}/?))>~&lt;$1&gt;~gi


Der optionale Slash am Ende bezieht sich wohl auf sowas wie <br />.

Wenn man sich jetzt noch den Gefallen tut mit x zu arbeiten wirds auch übersichtlicher:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
s~<
  (
   /?
   (?:
     [^bi]          |
     [^/>]{2,}/?
   )
  )
  >
 ~&lt;$1&gt;~gix


Ach ja und bevor Du fragst ;) (?: ... ) ist eine gruppierende aber nicht speichernde Klammer. Ohne ?: wäre der Inhalt nochmal zusätzlich in $2 abgelegt worden, was unnötig Platz und Zeit kostet.\n\n

<!--EDIT|Crian|1093860415-->
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
<< |< 1 2 >| >> 13 Einträge, 2 Seiten



View all threads created 2004-08-29 21:50.