Immer wieder regulärer Ausdruck
Gustl
- perl
Ich kann anscheinend nicht kryptisch genug denken weil ich immer wieder an diesen regulären Ausdrücken (Suchmustern) verzweifle.
Ich muss aus Texteingaben Telnummern, eMailaddys und URLs rausfiltern (maskieren, unbrauchbar machen), und das möglichst effektv, d.h. der übrige Text darf nicht verstümmelt werden. Mir geht es um die generelle Anweisungslogik und um die Umsetzung in den regulären Ausdruck.
Jetzt brauche ich sowas in der Art, hab ich mir ausgedacht:
Tel:
Ersetze eine Zahl grösser 9999, und zwar auch wenn die Nummernfolge beliebige Leerzeichen enthält aber keine Buchstaben a-z gross oder klein dazwischen sind.
eMail:
Ersetze 2 Zeichen
vor und nach einem @,
einem (at),
einem (ät),
einem LEER[LEER],
einem LEER[LEER],
einem LEER[LEER],
einem [LEER]at[LEER],
einem [LEER]ät[LEER],
einem [LEER]klammeraffe[LEER],
schneide die gängigsten endungen und auch noch 2 zeichen davor raus, auch wenn ein leerzeichen dazwischen ist. (.de .at .ch .net .com .org .biz und blitz etc...)
URLs:
Das entfernen der Endungen incl. 2 Zeichen davor aus den eMails wirkt dann auch bei den URLs, denn bei www.example.com käme nur noch www.exampxxxxxm heraus.
Wie würdet ihr das umsetzen und wie schreibt man so sch... koplizierte reguläre Ausdrücke? Ich bin da einfach überfordert, geb ich ehrlich zu.
Hi,
Ich muss aus Texteingaben Telnummern, eMailaddys und URLs rausfiltern (maskieren, unbrauchbar machen), und das möglichst effektv, d.h. der übrige Text darf nicht verstümmelt werden. Mir geht es um die generelle Anweisungslogik und um die Umsetzung in den regulären Ausdruck.
da sehe ich schon das erste Problem. Du willst verschiedene Aufgabenstellungen in _den_ regulären Ausdruck umsetzen.
Ersetze eine Zahl grösser 9999, und zwar auch wenn die Nummernfolge beliebige Leerzeichen enthält aber keine Buchstaben a-z gross oder klein dazwischen sind.
Hm. '112' ist also keine Telephonnummer, aber bei '1 000 000 Euro' siehst Du eine Telephonnummer.
Seltsame Ansicht ...
cu,
Andreas
da sehe ich schon das erste Problem. Du willst verschiedene Aufgabenstellungen in _den_ regulären Ausdruck umsetzen.
Hm. '112' ist also keine Telephonnummer, aber bei '1 000 000 Euro' siehst Du eine Telephonnummer.
Seltsame Ansicht ...cu,
Andreas
stimmt, das wird nix mit der million. aber grade deshalb starte ich ja hier diesen thread. andreas, wie würdest DU das machen und in den regulären ausdruck umsetzen?
Hi,
stimmt, das wird nix mit der million. aber grade deshalb starte ich ja hier diesen thread. andreas, wie würdest DU das machen und in den regulären ausdruck umsetzen?
Dazu müßte ich erstmal die Aufgabenstellung genauer kennen.
Warum sollen z.B. die Telephonnummern aus dem Text raus?
Was passiert schreckliches, wenn nicht alle Telephonnummern rausgelöscht werden?
Und was, wenn Nicht-Telephon-Nummern aus dem Text rausgelöscht werden?
Und ob ich dann reguläre Ausdrücke verwenden würde, kann ich natürlich auch noch nicht sagen ...
Für die URLs: am Anfang eine Alternative mit den üblichen Protokollnamen, danach ein '://', und danach zwischen ein und unendlich (sprich: Quantifier +) url-zulässige Zeichen.
Bei Mail-Adressen: welche Formen der Mail-Adressen sollen erkannt werden?
Nur user.name@example.org? Oder auch
User Name user.name@example.org
?
Oder ...
cu,
Andreas
Warum sollen z.B. die Telephonnummern aus dem Text raus?
Was passiert schreckliches, wenn nicht alle Telephonnummern rausgelöscht werden?
Und was, wenn Nicht-Telephon-Nummern aus dem Text rausgelöscht werden?
cu,
Andreas
Naja, Andreas, die Eingabe von tel, mail oder url ist schlicht und ergreifend nicht erlaubt. Und das ist halt mal ein entscheidendes Kriterium.
Kann oder will mir da jetzt keiner weiterhelfen? Ich hab mir mal ein Testscript gebaut indem ich die unerwünschten Zeichen einfach rausschneide.
$test =~ s/www|alice|arcor|online|freenet|aon|msn|gmail|googlemail|trash-mail|yahoo|gmx|web|aol|bluewin|vr-web|hotmail|cablelink|email|t-online|@| @ |@ | @|at|\(at\)|\( at \)|\( at\)|\(at \)|a t|ät|\(ät\)|\( ät \)|\( ät\)|\(ät \)|ä t|et|\(et\)|\( et \)|\( et\)|\(et \)|e t|klammeraffe|\(klammeraffe\)|.de|. d e|.d e|. de|.eu|. eu|.e u|. e u|.at|. a t|.a t|. at|.ch|. c h|.c h|. ch|.com|.c o m|. c o m|. com|.c om|. co m|.co m|.net|. n e t|.n e t|. net|.n et|. ne t|.ne t|.org|. o r g|.o r g|. org|.o rg|. or g|.or g|015|016|017|0 1 5|0 1 6|0 1 7|15|16|17|1 5|1 6|1 7|\+49|\+43|\+41|\+39|01|02|03|04|05|06|07|08|09|0 1|0 2|0 3|0 4|0 5|0 6|0 7|0 8|0 9//g;
Im Grunde hat das soweit die gewünschte Wirkung, der Absender kann kaum mehr betrügen. Aber es verstümmelt den Text derart, dass man glaubt der Absender wäre besoffen. So kann ich es nicht einbauen.
Sagt´s mal, gibts nicht irgendwo ein .pm das sowas besser kann?
Sagt´s mal, gibts nicht irgendwo ein .pm das sowas besser kann?
Nein, denn Module mögen eine URI erkennen, nicht aber irgendwelche URI-Leichen.
Wenn du ein Problem mit User-Kommentaren hast, dann schalte sie erst frei, nachdem du sie konsultiert hast.
Es ist möglich, dass Beiträge dann der Freischaltung bedürfen, wenn sie inhaltlich bestimmte Kriterien nicht erfüllt haben. Aber es ist immer möglich, diesen Kriterien zu entkommen.
Ich würde mich dazu auch gar nicht auf eigene Kriterien berufen, sondern gleich einen Bayes-Filter anwenden.
mfg Beat
Hi,
Naja, Andreas, die Eingabe von tel, mail oder url ist schlicht und ergreifend nicht erlaubt. Und das ist halt mal ein entscheidendes Kriterium.
Dann hilft wirklich nur manuelle Kontrolle.
Kann oder will mir da jetzt keiner weiterhelfen? Ich hab mir mal ein Testscript gebaut indem ich die unerwünschten Zeichen einfach rausschneide.
$test =~ s/www|alice|arcor|online|freenet|aon|msn|gmail|googlemail|trash-mail|yahoo|gmx|web|aol|bluewin|vr-web|hotmail|cablelink|email|t-online|@| @ |@ | @|at|\(at\)|\( at \)|\( at\)|\(at \)|a t|ät|\(ät\)|\( ät \)|\( ät\)|\(ät \)|ä t|et|\(et\)|\( et \)|\( et\)|\(et \)|e t|klammeraffe|\(klammeraffe\)|.de|. d e|.d e|. de|.eu|. eu|.e u|. e u|.at|. a t|.a t|. at|.ch|. c h|.c h|. ch|.com|.c o m|. c o m|. com|.c om|. co m|.co m|.net|. n e t|.n e t|. net|.n et|. ne t|.ne t|.org|. o r g|.o r g|. org|.o rg|. or g|.or g|015|016|017|0 1 5|0 1 6|0 1 7|15|16|17|1 5|1 6|1 7|\+49|\+43|\+41|\+39|01|02|03|04|05|06|07|08|09|0 1|0 2|0 3|0 4|0 5|0 6|0 7|0 8|0 9//g;
Daß hier einige der Alternativen überflüssig sind, ist Dir aber schon bewußt?
Im Grunde hat das soweit die gewünschte Wirkung, der Absender kann kaum mehr betrügen.
Nur weil Du das denkst, ist das aber noch lange nicht so.
Beispiele, um Deinen Ausdruck auszutricksen:
Webseite: w_w_w_._e_x_a_m_p_l_e_._o_r_g
Mail: m/a/i/l/bei/e/x/a/m/p/l/e/./o/r/g
Telephonnummer: nullhundertneunzig sechssechssechs sechssechssechs *)
Aber es verstümmelt den Text derart, dass man glaubt der Absender wäre besoffen. So kann ich es nicht einbauen.
Richtig - das ist eines der großen Probleme der meisten automatischen Badword-Filter, die sind nicht intelligent genug.
Das andere ist, daß sie sehr leicht umgangen werden können, siehe Beispiele oben.
cu,
Andreas
*) gibt's die 0190er eigentlich noch? Falls ja: Achtung, kostenpflichtig, und erst ab 18 ;-)