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

regex: Strings nach Spam filtern: Spamfilter selbstgemacht



<< |< 1 2 >| >> 14 entries, 2 pages
Froschpopo
 2003-09-12 16:30
#51449 #51449
User since
2003-08-15
2653 articles
BenutzerIn
[default_avatar]
Ich bin Betreiber einer relativ großen Partnerbörse im Internet.
Nun habe ich das Problem, dass viele Leute ihr Profil unnötig lang strecken indem Sie Buchstaben häufig wiederholen.

Ein paar Beispiele:

Beispiel 1.
Code: (dl )
hallo, was geht ab (der rest besteht aus leerzeichen die nur den Zweck erfüllen die vorgeschriebene min. Länge von 120 Zeichen zu erreichen.)

Beispiel 2.
Code: (dl )
bla bla bla bla bla bla bla...

Beispiel 3.
Code: (dl )
oooooooooooooooooooooooooooooooo...

Beispiel 4.
Code: (dl )
as80ash0dhas0ahsdhoshdoihoihoihoiashd0asdha0sdhas0dh

solche Arten von Spam möchte natürlich gerne verhindern. Vielleicht könnt Ihr mich ein bissl beraten, bei der Suche nach Funktionen um solche SPammer zu bekämpfen.

für letzteres (beispiel 4.) verwende ich jetzt folgendes Muster:
Code: (dl )
s/(\S{68})(?!.*?>)/$1<BR>/g;

das stellt mich vorerst zufrieden, aber das ist nur ein kleiner Anfang gewesen (beachte auch die anderen Beispiele).

Gruß
havi
 2003-09-12 16:34
#51450 #51450
User since
2003-08-04
2036 articles
BenutzerIn
[Homepage]
user image
Hi!

Für Beispiel 1 kannst du ja einfach die abschliessenden Blanks entfernen!

Bsp.
Code: (dl )
my $string =~ s%\s+$%%g;


... fuer fuehrende Blanks kannst du folgendes verwenden:
Code: (dl )
my $string =~ s%^\s+%%g;


... wenn du beides in einer Zeile machen willst dann so:
Code: (dl )
my $string =~ s%^\s+|\s+$%%g; # was aber langsamer ist


Gruss
havi
 2003-09-12 16:47
#51451 #51451
User since
2003-08-04
2036 articles
BenutzerIn
[Homepage]
user image
Jetzt ist mir gerade aufgefallen das du das auch für Beispiel 2 und Beispiel 3 verwenden kannst!

Einfach \s durch bla bzw. o ersetzen...

Gruss
Froschpopo
 2003-09-12 16:53
#51452 #51452
User since
2003-08-15
2653 articles
BenutzerIn
[default_avatar]
und was ist mit mittigen blanks? z.b.:
Code: (dl )
hallo           du

ich halte es für sinnvoller, alles abzuschneiden was öfter als 3 mal hintereinander vorkommt.
eisbeer
 2003-09-12 17:03
#51453 #51453
User since
2003-08-29
347 articles
BenutzerIn
[Homepage] [default_avatar]
$string =~s/\s{3,}//g

Reicht schon denke ich, weil niemand mehr als 3 Leerzeichen macht,
und wenn doch, hatter Pech, weil es wirklich keinen typographischen
und logischen sinn gibt, mehr als 1 Leerzeichen zu setzen :)
Die meisten PC Probleme befinden sich zwischen Bildschirm und Stuhl...
Froschpopo
 2003-09-12 17:08
#51454 #51454
User since
2003-08-15
2653 articles
BenutzerIn
[default_avatar]
s/\[a-zA-Z_0-9]{3,}//g wie kann man denn das \s dort noch hineinbringen, weil ich will ja auch wörter wie spaaaaam filtern
Ishka
 2003-09-12 17:30
#51455 #51455
User since
2003-08-04
771 articles
HausmeisterIn
[Homepage] [default_avatar]
s#(..?)\1{3,}#$1$1$1#gs;
ersetzt vier oder mehr Zeichen vom selben Typ hintereinander (bzw. die selbe Kombination aus zwei Zeichen) durch dreimal dieses Zeichen (kombination dieses Zeichens).
sub z{if(@_){1while$x[$k=rand 10];t($t=$x[$k]=1)}print map"$z[$x[$_]]$_".($_%3?
"":"\n"),1..9}sub t{$j=0;$x[$_+1]==$t&&($j+=2**$_)for 0..8;z,die"Gewinner $z[$t]
"if grep$_==($j&$_),7,56,73,84,146,273,292,448;z,die"Gleichstand\n"if@x>9&&!grep
!$_,@x}@x=4;@z=qw{. [ (};z$^T&1;while(<>){next if$_>9||$x[$_];t$t=$x[$_]=2;z 1}
Ishka
 2003-09-12 17:34
#51456 #51456
User since
2003-08-04
771 articles
HausmeisterIn
[Homepage] [default_avatar]
[quote=eisbeer,12.09.2003, 15:03]$string =~s/\s{3,}//g

Reicht schon denke ich, weil niemand mehr als 3 Leerzeichen macht,
und wenn doch, hatter Pech, weil es wirklich keinen typographischen
und logischen sinn gibt, mehr als 1 Leerzeichen zu setzen :)[/quote]
An manchen Stellen macht es schon Sinn mehr als ein \s zu setzten.

ein neuer Absatz zum Beispiel enthält zwei \n (in \s enthalten) direkt hintereinander. Außerdem kann es durchaus vorkommen, daß man mal ein Leerzeichen am Ende der Zeile stehen lässt. Und wenn jemand nen großen Absatz machen will, sind das schon vier \s hintereinander, die man nicht wirklcih als Spam bezeichen kann.
sub z{if(@_){1while$x[$k=rand 10];t($t=$x[$k]=1)}print map"$z[$x[$_]]$_".($_%3?
"":"\n"),1..9}sub t{$j=0;$x[$_+1]==$t&&($j+=2**$_)for 0..8;z,die"Gewinner $z[$t]
"if grep$_==($j&$_),7,56,73,84,146,273,292,448;z,die"Gleichstand\n"if@x>9&&!grep
!$_,@x}@x=4;@z=qw{. [ (};z$^T&1;while(<>){next if$_>9||$x[$_];t$t=$x[$_]=2;z 1}
eisbeer
 2003-09-12 18:14
#51457 #51457
User since
2003-08-29
347 articles
BenutzerIn
[Homepage] [default_avatar]
Ja, deiner Meinung ishka, aber die Leerzeichen werden rausgestrichen und dann gecheckt ob der Text kleiner als 120 Zeichen ist. Ich habs jetzt einfach noch n bissle verfeinert:

Code: (dl )
$string =~s/[ ]{3,}/ /g;


bzw.

Code: (dl )
$string =~s/[\w\d \.\-]{3,}//ig;
Die meisten PC Probleme befinden sich zwischen Bildschirm und Stuhl...
Froschpopo
 2003-09-12 18:40
#51458 #51458
User since
2003-08-15
2653 articles
BenutzerIn
[default_avatar]
wieso kleiner als 120? ich will die leute lediglich zwingen ordentliche Worte und Sätze zu schreiben!
<< |< 1 2 >| >> 14 entries, 2 pages



View all threads created 2003-09-12 16:30.