Schrift
[thread]5718[/thread]

regex: Strings nach Spam filtern: Spamfilter selbstgemacht (Seite 2)



<< |< 1 2 >| >> 14 Einträge, 2 Seiten
eisbeer
 2003-09-12 18:44
#51459 #51459
User since
2003-08-29
347 Artikel
BenutzerIn
[Homepage] [default_avatar]
Machst du damit ja auch indirekt, aber Perl ist nunmal keine Person
mit verstand. Du kannst höchstens unlogische dinge verbieten, wie
zB mehr als 3malige wiederhohlungen eins buchstaben oder so ...
Bzw nicht verbieten, sondern löschen, und was dann noch übrig bleibt,
muss min. 120 Zeichen beinhalten.
Die meisten PC Probleme befinden sich zwischen Bildschirm und Stuhl...
havi
 2003-09-12 19:01
#51460 #51460
User since
2003-08-04
2036 Artikel
BenutzerIn
[Homepage]
user image
[quote=Froschpopo,12.09.2003, 14:53]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.[/quote]
Code: (dl )
my $string =~ s% +% %g; # ersetzt mehrere Blanks im String auf eines...


Gruss
Dubu
 2003-09-13 11:59
#51461 #51461
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
[quote=eisbeer,12.09.2003, 16:14]
Code: (dl )
$string =~s/[\w\d \.\-]{3,}//ig;
[/quote]
Das macht nun überhaupt nicht das richtige, denn es löscht jedes Wort mit mehr als zwei Zeichen aus der angegebenen Menge - höchstwahrscheinlich also den ganzen Text!

Ging es nicht eigentlich auch um mehr als drei Zeichen? Drei gleiche Buchstaben hintereinander kommen in der deutschen Sprache (gerade nach der RSReform) recht häufig vor. Auch sollten die Zeichen IMHO nicht einfach gelöscht werden, sondern durch ein einzelnes ersetzt. Sonst wird aus einem "Stillleben" schnell mal ein "Stileben" oder gar "Stieben".
Und warum die Beschränkung auf die angegebenen Zeichen? Sollte jemand zwar kein hundert "x", aber hundert "!" hintereinander schreiben dürfen?

Mir gefällt Ishkas Ansatz am besten, würde ihn aber noch verallgemeinern:
Code: (dl )
s/(.+)\1{3,}/$1/s

Das ersetzt eine beliebige Folge von Zeichen, die mehr als dreimal wiederholt wird, durch eine einzelne dieser Folgen. Das heißt:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
"Hallo                                           Leser!"
# wird zu
"Hallo Leser!"

blablablablablablabla
# wird zu
bla

Stillleben
# bleibt
Stillleben
Ishka
 2003-09-13 14:22
#51462 #51462
User since
2003-08-04
771 Artikel
HausmeisterIn
[Homepage] [default_avatar]
[quote=Dubu,13.09.2003, 09:59][quote=eisbeer,12.09.2003, 16:14]
Code: (dl )
1
2
3
[...]
Mir gefällt Ishkas Ansatz am besten, würde ihn aber noch verallgemeinern:
[code]s/(.+)\1{3,}/$1/s

Das ersetzt eine beliebige Folge von Zeichen, die mehr als dreimal wiederholt wird, durch eine einzelne dieser Folgen. Das heißt:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
"Hallo                                           Leser!"
# wird zu
"Hallo Leser!"

blablablablablablabla
# wird zu
bla

Stillleben
# bleibt
Stillleben
[/quote]
Verallgemeinern, ok - aber ich würd mehr als drei Zeichen durch dreinmal dasselbe ersetzen, denn wenn sich jemand vertippt, dann wird aus og. Stilllleben ein Stileben. Und jetzt hab ich noch ein Fragezeichen ins Matching eingebaut, damit nicht !!!!!!...!! drei !!! als Muster erkannt werden und dann neun stehenbleiben oder so.
Code: (dl )
s#(.+?)\1{3,}#$1$1$1#gs;
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}
<< |< 1 2 >| >> 14 Einträge, 2 Seiten



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