Regex: eckige Klammer mit Text suchen
Regex: eckige Klammer mit Text suchen
am 16.08.2006 17:11:51 von Andreas Just
Hallo,
ich habe schon gesucht, finde aber nichts was mein Problem loest.
Als Gelegenheits Perl-Nutzer habe ich hiermit ein Problem:
Mein Gästebuch war nun fast 1/2 Jahr spamfrei - nun hat irgendeiner
meinen simplen Schutz gefunden und umgeht ihn (ich gebe den
Zeitstempel im Formular mit aus und Einträge dürfen frühestens nach
10sec und spätestens nach 10min zurückkommen. Das klappte bis dato
auch problemlos und es gab auch genug echte Einträge.
Nun möchte ich eine Sache hinzufügen:
Prüfen ob der String
"[url" oder "[URL" im Text vorkommt (das ist bei jedem Spameintrag mit
drinnen) - ich schaffe es aber nicht das abzubilden. Entweder bricht
das Script ab oder er findet den String nicht.
Folgendes habe ich probiert
$foo =~ /[url/
$foo =~ /\[url/
$foo =~ /"[url"/
$foo =~ /"\[url"/
Ein kleiner Hinweis wäre nett...
Andreas
Re: Regex: eckige Klammer mit Text suchen
am 16.08.2006 17:17:29 von Paul Hink
Andreas Just wrote:
> Prüfen ob der String "[url" oder "[URL" im Text vorkommt (das ist bei
> jedem Spameintrag mit drinnen) - ich schaffe es aber nicht das
> abzubilden. Entweder bricht das Script ab oder er findet den String
> nicht.
>
> Folgendes habe ich probiert
> [...]
> $foo =~ /\[url/
Das ist die korrekte Variante. Für das case-insensitive Matchen noch
ein "i" dahinter.
Funktioniert das bei dir wirklich nicht? Wenn ja, Fehlermeldung?
Paul
Re: Regex: eckige Klammer mit Text suchen
am 16.08.2006 17:20:08 von Thomas Wittek
Andreas Just schrieb:
> Nun möchte ich eine Sache hinzufügen:
> Prüfen ob der String=20
> "[url" oder "[URL" im Text vorkommt (das ist bei jedem Spameintrag mit
> drinnen) - ich schaffe es aber nicht das abzubilden. Entweder bricht
> das Script ab oder er findet den String nicht.
>=20
> Folgendes habe ich probiert=20
> $foo =3D~ /[url/=20
> $foo =3D~ /\[url/=20
> $foo =3D~ /"[url"/=20
> $foo =3D~ /"\[url"/=20
Die öffnende eckige Klammer ist ein Kontrollzeichen der Regulären
Ausdrücke (wird benutzt, um Zeichenmengen zu deklarieren), muss also
escaped werden. Der Modifier "i" am Ende gibt an, dass die Regexp
case-insensitive arbeitet:
$foo =3D~ /\[url/i;
Schöne Grüße,
-Thomas
Re: Regex: eckige Klammer mit Text suchen
am 16.08.2006 17:36:16 von Andreas Just
On 16 Aug 2006 15:17:29 GMT, Paul Hink wrote:
danke fürs schnelle Feedback..
>> $foo =~ /\[url/
>
>Das ist die korrekte Variante. Für das case-insensitive Matchen noch
>ein "i" dahinter.
>
>Funktioniert das bei dir wirklich nicht? Wenn ja, Fehlermeldung?
Die Version bricht zumindest nicht ab, findet aber den String
scheinbar nicht.
Die Codezeile ist
if (($name eq $keytext) && ($checkval =~ m/\[url/i)) {exit;}
oder halt
if ($name eq $keytext)
{
if ($checkval =~ m/\[url/i)
{exit;}
}
Und der Teststring ist halt sowas wie "lkdnsdsdlsa[urlksadgkd".
Fehlermeldung gibts da natürlich keine.
Irgendwie stehe ich da echt auf dem Schlauch ;-)
Andreas
Re: Regex: eckige Klammer mit Text suchen
am 16.08.2006 17:46:29 von Paul Hink
Andreas Just wrote:
> Die Version bricht zumindest nicht ab, findet aber den String
> scheinbar nicht.
>
> Die Codezeile ist
>
> if (($name eq $keytext) && ($checkval =~ m/\[url/i)) {exit;}
Ohne mehr Kontext kann man dazu kaum was sagen. Ist $name gleich
$keytext?
Paul
Re: Regex: eckige Klammer mit Text suchen
am 16.08.2006 18:10:08 von Andreas Just
On 16 Aug 2006 15:46:29 GMT, Paul Hink wrote:
>Ohne mehr Kontext kann man dazu kaum was sagen. Ist $name gleich
>$keytext?
Yepp - das Script läut da auch rein.
Ich habe jetzt mal die Feldprüfung weggelassen (sprich prüfe jedes
Feld)- findet trotzdem nix.
Das ist der (abgespeckte) Codeblock
foreach $field (@Parmfields)
{
($name, $value) = split(/=/, $field);
#das geht auch nicht#
if ($value =~ m/\[url/i) {exit;}
$checkval = trim($value);
if (($name eq $keytext) && ($checkval =~ m/\[url/i)) {exit;}
#das hier funktioniert#
if (($name eq $keyname) && (length($checkval) < 2))
{showErrorPage($keyname);}
elsif (($name eq $keytext) && (length($checkval) < 10))
{showErrorPage($keytext);}
}
Ich glaube ich erweitere lieber meine Zeitstempelprüfung.
(Tag der Woche * 123456) + zeitstempel ;-)
und dann wieder zurück. Dann haben die Leute um Mitternacht zwar ein
Problem, aber ...
Andreas
Re: Regex: eckige Klammer mit Text suchen
am 16.08.2006 19:09:05 von Ferry Bolhar
Andreas Just:
> Folgendes habe ich probiert:
> $foo =~ /\[url/
Das sollte passen, ev. hinten nach noch
ein "i", dh.,
$foo =~ /\[url/i;
damit auch "[URL" gefunden wird.
Überprüfe ggf, ob der Spammer zwischen die Zeichen nicht auch
noch Binärzeichen (dh., solche, die nicht sofort sichtbar sind)
gesetzt hat, da die obige Regex dann entsprechend erweitert
werden müsste.
LG, Ferry
--
Ing. Ferry Bolhar
Municipality of Vienna, Department 14
A-1010 Vienna / AUSTRIA
E-mail: bol@adv.magwien.gv.at