Irritationen mit Regulärem Ausdruck
Christoph Schnauß
- perl
hallo Forum ;-)
Ich vrsuche grade, mit einem regulären Ausdruck Eingabemöglichkeiten für eine Formular-Eingabe zu beschränken. Konkret geht es mir darum, daß jemand in einem Formular seinen Namen eintippen soll, wobei deutsche Umlaute und das Leerzeichen erlaubt sein sollen, aber alle Sonderzeichen nicht. Dazu habe ich folgendes eingesetzt:
$name =~ /[^\w.;,!? ]/
Das funktioniert auch ganz gut. Aber irgendwas haut bei Groß-/Kleinschreibung nicht hin. Wenn ich mich in meinem Formular beispeilsweise als "christoph.schnauss" einzutragen versuche, klappt es und ich kriege das gewünschte "Du NBösewicht" zu lesen. Gebe ich aber "Christoph.Schnauss" ein, passiert gar nix bzw. das Script fährt völlig unbeeindruckt weiter. Gebe ich "Christoph Schnauss." ein, gibts wieder die "Bösewicht"-Anzeige.
Hat jemand eine Erklärung dafür und/oder einen hilfreichen Hinweis?
Grüße aus Berlin
Christoph S.
Hi Christoph,
Ich vrsuche grade, mit einem regulären Ausdruck Eingabemöglichkeiten für eine Formular-Eingabe zu beschränken. Konkret geht es mir darum, daß jemand in einem Formular seinen Namen eintippen soll, wobei deutsche Umlaute und das Leerzeichen erlaubt sein sollen, aber alle Sonderzeichen nicht.
ich würde das zB so machen:
if ($name !~ /[1]+$/) {
#Bösewicht
}
Markus Trusk.
a-zA-ZäöüÄÖÜ\s ↩︎
hi,
ich würde das zB so machen:
if ($name !~ /[1]+$/) {
#Bösewicht
}
Nö ;-)
Ich habs eben mal durchgespielt. Die deutschen Umlaute sollen ja zulässig sein. Ich habs eben mal durchgespielt, und da bekomme ich dann meine "Bösewicht"-Anzeige auch dann, wenn ich mich mit "Christoph Schnauß" anzumelden versuche. Natürlich steht das Ganze bei mir auch in einer solchen if/else-Abfrage, da hast du schon recht. Ich hielt das aber für selbstverständlich bzw. aus der Fragestellung für ersichtlich, so daß ich das vorhin niht mitgepostet habe.
Ok, ich gebs zu, wenn ich das "ß" jetzt mit reinstopfe in den Ausdruck, dann klappt es (scheinbar?). Nette Zutat allerdings, daß auch gleich die Ziffern 0-9 mit rausgefiltert werden, danke.
Ich habe aber rationell nicht begründbare Vorbehalte gegenüber Abfragen dieser Art, weil hier gefragt wird "wenn nicht, dann ...". Ich frage lieber nach "wenn, dann ...", obwohl ich das nicht begründen kann. Muß ich mir nochmal gründlich durchdenken.
Zusatzfrage:
Wenn ich zwei Wörter als Namensbestandteile zulassen möchte, also im Beispiel
"Christoph Schnauß"
ebenso korrekt ist wie
"Christoph" oder "Schnauß",
aber drei Wörter nicht mehr korrekt sind, also
"Christoph Gottlieb Schnauß"
(jaja, ich heiße wirklich so) untersagt werden soll, krieg ich das auch noch nicht hin. Das Leerzeichen könnte ich wieder rausnehmen, womit dann aber nur noch ein Wort zulässig wäre.
Die Forumsoftware hier läßt ja solche usernamen wie "Herbert mit den großen Ohren und dem kleinen Hirn" zu, insofern ist das, was ich mir bei CK's fleißiger Arbeit abschreiben kann, nicht als Vorlage vergleichbar.
Grüße aus Berlin
Christoph S.
a-zA-ZäöüÄÖÜ\s ↩︎
Hallo Christoph,
Die Forumsoftware hier läßt ja solche usernamen wie "Herbert mit
den großen Ohren und dem kleinen Hirn" zu, [...]
Die Forums-Software läßt nur Usernamen mit Kleinbuchstaben und Zahlen
zu.
Grüße,
CK
ähm,
Die Forums-Software läßt nur Usernamen mit Kleinbuchstaben und Zahlen zu.
Es ist möglich, daß wir jetzt unter "username" unterschiedliche Dinge verstehen. Bei meinem "my"-account habe ich nur Kleinbuchstaben und Ziffern verwendet (hab jetzt nicht nachgeschaut, obs dazu eine entsprechende Empfehlung gibt), aber mein "Anmeldename", den du ja als Verfassername bei jedem posting siehst, enthält durchaus zwei Großbuchstaben, und ich möchte auch gerne, daß das so bleibt ;-)
Aber wenn du schonmal im Forum vorhanden bist, noch eine Zusatzfrage, die mich auch schon längere Zeit beschäftigt: das Konzept der Regulären Ausdrücke gibts ja nicht nur in PERL, C und sogar in Javascript. Oft kann ich Ausdrücke 1:1 aus PERL nach TCL/Tk übernehmen und in weiteren Sprachen ohne viel Klimbim verbauen. Prima. Aber es klappt nicht _immer_. Gibts dazu irgendwo eine Übersicht, wo und wie das Handling der Regulären Ausdrücke in den diversen Sprachen vollzogen wird?
Grüße aus Berlin
Christoph S.
Hallo Christoph,
Es ist möglich, daß wir jetzt unter "username" unterschiedliche
Dinge verstehen. Bei meinem "my"-account habe ich nur
Kleinbuchstaben und Ziffern verwendet (hab jetzt nicht
nachgeschaut, obs dazu eine entsprechende Empfehlung gibt), aber
mein "Anmeldename", den du ja als Verfassername bei jedem posting
siehst, enthält durchaus zwei Großbuchstaben, und ich möchte auch
gerne, daß das so bleibt ;-)
Der Verfasser-Name ist nicht der Username. Der Username ist das, was
du eingeben musst, wenn die Dialog-Box kommt.
[... Übersicht RegEx-Engine-Unterschiede ...]
'Mastering Regular Expressions' von Jeffrey E. Friedl
Grüße,
CK
morgens CK,
'Mastering Regular Expressions' von Jeffrey E. Friedl
Danke.
Aber mal zurück zur Ausgangsfrage ganz oben. Wenn du dir mein Eröffnungsposting anschaust, so möchte ich nicht nur wissen, wie ich es "richtig" machen kann (dazu gibts im Thred dankenswerterweise Aussagen), sondern ich möchte auch verstehen können, _warum_ ich die beschriebenen Irritationen erlebt habe.
Grüße aus Berlin
Christoph S.
Hallo Christoph,
Wenn du dir mein Eröffnungsposting anschaust, so möchte ich nicht nur
wissen, wie ich es "richtig" machen kann (dazu gibts im Thred
dankenswerterweise Aussagen), sondern ich möchte auch verstehen
können, _warum_ ich die beschriebenen Irritationen erlebt habe.
Dazu müsste ich dein Problem verstehen. Der RegEx /[^\w.;,!? ]/ matcht
auf keines der drei von dir beschriebenen Strings:
ckruse@sunshine:~ $ cat test.pl
#!/usr/bin/perl -w
use strict;
my @entries = (
'Christoph Schnauss',
'christoph.schnauss',
'Christoph.Schnauss',
'Christoph Schnauss.'
);
foreach my $ent (@entries) {
if($ent =~ /[^\w.;,!? ]/) {
# boehze-Fall
print "matching\n";
}
else {
# luep-Fall
print "not matching\n";
}
}
ckruse@sunshine:~ $ ./test.pl
not matching
not matching
not matching
not matching
ckruse@sunshine:~ $
Grüße,
CK
Hi nochmal,
Ok, ich gebs zu, wenn ich das "ß" jetzt mit reinstopfe in den Ausdruck, dann klappt es (scheinbar?). Nette Zutat allerdings, daß auch gleich die Ziffern 0-9 mit rausgefiltert werden, danke.
DAs hast du allerdings recht :) Das ß gehört natürlich auch noch hinein :)
Ich habe aber rationell nicht begründbare Vorbehalte gegenüber Abfragen dieser Art, weil hier gefragt wird "wenn nicht, dann ...". Ich frage lieber nach "wenn, dann ...", obwohl ich das nicht begründen kann. Muß ich mir nochmal gründlich durchdenken.
Das stimmt. So sollte man es auch machen, aber ich wollte es nur an deine Problemstellung anpassen.
Zusatzfrage:
Wenn ich zwei Wörter als Namensbestandteile zulassen möchte, also im Beispiel
"Christoph Schnauß"
ebenso korrekt ist wie
"Christoph" oder "Schnauß",
aber drei Wörter nicht mehr korrekt sind, also
"Christoph Gottlieb Schnauß"
(jaja, ich heiße wirklich so) untersagt werden soll, krieg ich das auch noch nicht hin. Das Leerzeichen könnte ich wieder rausnehmen, womit dann aber nur noch ein Wort zulässig wäre.
Du könntest es zB so machen:
if ($name =~ /[1]+(\s{1,2}[a-zA-ZäöüÄÖÜß]+)?$/) {
print "Name ist valid\n";
} else {
print "Name ist invalid\n";
}
P.S {1,2} soll eine Begrenzung an Leerzeichen zwischen Vorname und Nachname sein, damit zb
Markus Trusk und
Markus Trusk valide ist.
Markus Trusk ist aber nicht mehr valid.
Wenn du diese Option nicht wünscht, und Namen wie
Markus Trusk
zulassen willst, ersetze {1,2} einfach duruch ein +
Markus Trusk.
a-zA-ZäöüÄÖÜß ↩︎
Hallo Christoph.
Der Bösewicht im Ausdruck dürfte der Punkt sein. Der hat ne besondere Bedeutung (siehe </selfhtml/cgiperl/sprache/regexpr.htm#maskierung>) und muss maskiert werden
$name =~ /[^\w.;,!? ]/
Grüße aus Würzburg
Julian
Hallo,
Der Bösewicht im Ausdruck dürfte der Punkt sein. Der hat ne besondere Bedeutung
...aber nicht in Zeichenklassen. Da ist ein Punkt tatsächlich ein Punkt. Der Ausdruck funktioniert wahrscheinlich deswegen nicht, weil Christoph alle Wortzeichen verbietet.
/[^\w.;,!? ]/
^
negierte Zeichenklasse.
Ich bin mir nicht ganz sicher, aber dieser Ausdruck liefert überhaupt nur WAHR zurück, wenn $name nur aus einem Zeichen, dass alles sein darf was nicht in den Klammern steht, besteht.
Markus Trusk.
hallo,
/[^\w.;,!? ]/
^
negierte Zeichenklasse.
Ich bin mir nicht ganz sicher, aber dieser Ausdruck liefert überhaupt nur WAHR zurück, wenn $name nur aus einem Zeichen, das alles sein darf was nicht in den Klammern steht, besteht.
Ahh, ja, das _könnte_ es tatsächlich sein.
Grüße aus Berlin
Christoph S.
hallo Julian,
(siehe </selfhtml/cgiperl/sprache/regexpr.htm#maskierung>)
$name =~ /[^\w.;,!? ]/
Oh. Du meinst also, ich hätte an der angegebenen Stelle die Erklärung "Der Punkt steht in regulären Ausdrücken ansonsten für ein beliebiges anderes Zeichen" noch nicht verstanden (gelesen hab ich sie mindestens drei dutzendmal)?
Hm. Möglicherweise hast du recht damit. Ich bin noch am Testen.
Grüße aus Berlin
Christoph S.
Hallo Christoph,
$name =~ /[^\w.;,!? ]/
Ich habe das so gelöst:
my $muster = "^|\s[a-zA-Z0-9ßäöüÄÖÜ_.-]*";
if ( $name =~ /^$muster$/ ) {
# tu was du nicht lassen kannst ;-)
}
else {
# "In League with Satan" oder so ähnlich ;-))
}
Vielleicht hilft's
Torsten
n'abends Torsten,
Ich habe das so gelöst:
my $muster = "^|\s[a-zA-Z0-9ßäöüÄÖÜ_.-]*";
if ( $name =~ /^$muster$/ ) {
# tu was du nicht lassen kannst ;-)
}
else {
# "In League with Satan" oder so ähnlich ;-))
}
Interessant. Da habe ich jetzt drei praktikable Hinweise in diesem kleinen Thread bekommen. Ich probiers aus. Wahrscheinlich wird das, was ich dann am Ende wirklich einsetze, etwas sein, was so einer Art "Quersumme" aus den drei Vorschlägen von Markus, Julian und dir entspricht. Aber das ist ja wurscht. Ich bin jedenfalls mal wieder geholfen worden.
Grüße aus Berlin
Christoph S.
PS: ich hab dir unlängst gemailt, daß du deine Grafik für mein "Testforum" endlich löschen kannst. Ist die mail angekommen (das "Testforum" existiert nicht mehr, sondern die dafür getesteten Scripts sind inzwischen ziemlich erfolgreich im Einsatz)?
Hallo Christoph,
my $muster = "^|\s[a-zA-Z0-9ßäöüÄÖÜ_.-]*";
Interessant.
Der Quantifier sollte allerdings besser "+" statt "*" sein.
PS: ich hab dir unlängst gemailt, daß du deine Grafik für mein "Testforum" endlich löschen kannst. Ist die mail angekommen (das "Testforum" existiert nicht mehr, sondern die dafür getesteten Scripts sind inzwischen ziemlich erfolgreich im Einsatz)?
Ist angekommen, ich wollte dir nur noch ein wenig "Karenzzeit" lassen ;-)
Grüße
Torsten
morgens,
Der Quantifier sollte allerdings besser "+" statt "*" sein.
ok, schon gut, _das_ krieg ich auch selber hin. Wichtig ist nicht, daß du mir eine vollständig funktionierende Lösung zeigst, wichtig ist, daß du mir zeigst, wie du denkst, daß man herangehen könnte (was du ja gemacht hast) - der SELF-Gedanke eben ;-)
Ist angekommen, ich wollte dir nur noch ein wenig "Karenzzeit" lassen ;-)
Danke, ist aber nicht mehr nötig. Inzwischen läuft alles zu meiner Zufriedenheit.
Grüße aus Berlin
Christoph S.