Pattern
Achot
- html
0 Matthias Apsel0 Achot0 Matthias Apsel0 Achot
-3 pl0 Matthias Apsel0 pl
0 Matthias Apsel- mathematik
0 MudGuard0 Regina Schaukrug
Hallo,
mein pattern sieht so aus
<input type="text" pattern="[0-9](?!00000)\d{5}">
Ich möchte erreichen, dass man keine 00000 eingeben kann, eine 0 am Anfang darf erlaubt sein. Auf der Seite http://pattern.tfcpc.de/pattern-tutorial.php gibt es zwar ein Beispiel Negative Vorhersagen passt aber nicht ganz auf mein Problem.
Hallo Achot,
genau einmal 0, gefolgt von 1 mal 1-9, gefolgt von drei mal \d oder
genau einmal 1-9 gefolgt von 4 mal \d
Edit: Es ist besser, zu überlegen, was erlaubt ist, als zu überlegen, was verboten ist.
Bis demnächst
Matthias
Hallo Matthias,
ich weiß leider nicht was du mir genau damit sagen willst? Aber genau einmal 0 ist auch nicht richtig, denn es dürfen auch Angaben mit 00120 oder 00012 oder 00002 oder 01000 oder 00200 eingegeben werden. Aber keine 00000 alles andere ist erlaubt, solange es Zahlen sind und es min und max 5 Zahlen sind.
Edit: Es ist besser, zu überlegen, was erlaubt ist, als zu überlegen, was verboten ist.
Es ist ALLES erlaubt bis auf 00000 und es dürfen nur Zahlen sein.
Hallo Achot,
Es ist ALLES erlaubt bis auf 00000 und es dürfen nur Zahlen sein.
Der Anfang ist:
[1-9]\d{4}
// 1-9, gefolgt von 4 Ziffern
|
// oder
0[1-9]\d{3}
// 0, gefolgt von 1-9, gefolgt von 3 Ziffern
Den Rest kriegst du selber hin.
Bis demnächst
Matthias
Hallo Matthias,
funktioniert leider nicht. Wenn ich 12345 eingebe, was ja zur ersten Regel passen würde kommt die Meldung, dass die Eingabe nicht zulässig ist.
Hallo Achot,
[1-9]\d{4}|0[1-9]\d{3}|00[1-9]\d{2}|000[1-9]\d|0000[1-9]
funktioniert mit 12345 auf https://regex101.com/ und auch in diesem Pen.
Bis demnächst
Matthias
Hallo Matthias Apsel,
funktioniert mit 12345 auf https://regex101.com/
Die regexe lassen sich sogar für die Nachwelt aufheben: https://regex101.com/r/eQkDs2/1
Bis demnächst
Matthias
Hallo Matthias Apsel,
[1-9]\d{4}|0[1-9]\d{3}|00[1-9]\d{2}|000[1-9]\d|0000[1-9]
(?!00000)\d{5}
ist kürzer und funktioniert auch.
Bis demnächst
Matthias
Tach!
[1-9]\d{4}|0[1-9]\d{3}|00[1-9]\d{2}|000[1-9]\d|0000[1-9]
(?!00000)\d{5}
ist kürzer und funktioniert auch.
Beide Muster funktionieren übrigens nur, weil anscheinend beim pattern-Attribut ein ^ am Anfang und $ am Ende angenommen wird. Anderenorts, ebenso wie bei verlinktem Regexp-Tester, lässt sich ohne ^-$-Einrahmung des Musters die Zeichenfolge (5 Ziffern) beliebig erweitern und bleibt gültig. Auch 0000012345 wäre ein gültiger Wert.
dedlfix.
ich würd's mit logisch && verknüpfen
my $s = '01000';
print
$s =~ /^\d\d\d\d\d$/ && $s !~ /^00000$/;
Tada!
Hallo pl,
Tada!
Das geht halt als pattern-Attribut nicht.
Bis demnächst
Matthias
Hi,
Tada!
Das geht halt als pattern-Attribut nicht.
Ach was!? Das geht nicht!? Und was machen wir denn dann!?
Ab in die Ecke und flennen?
Oder wir lassen uns was anderes einfallen!
Meine Güte, es muss doch sowieso serverseitig geprüft werden.
Hallo pl,
Ach was!? Das geht nicht!? Und was machen wir denn dann!?
Ab in die Ecke und flennen?
Oder wir lassen uns was anderes einfallen!
Die Aufgabenstellung ist, ein passendes pattern-Attribut zu finden. Dass man das mit client- oder serverseitigen Programmiersprachen auch anders lösen kann, steht außer Frage.
Bis demnächst
Matthias
Hallo Achot,
Aber keine 00000 alles andere ist erlaubt, solange es Zahlen sind und es min und max 5 Zahlen sind. Es ist ALLES erlaubt bis auf 00000 und es dürfen nur Zahlen sein.
Fünf aufeinander folgende Zahlen sind auch 25354748911.
Bis demnächst
Matthias
Hallo Matthias,
Fünf aufeinander folgende Zahlen sind auch 25354748911.
jetzt hast du es geschafft, dass ich vollkommen verwirrt bin. Also ich sehe 11 Zahlen :o
Tach!
Fünf aufeinander folgende Zahlen sind auch 25354748911.
jetzt hast du es geschafft, dass ich vollkommen verwirrt bin. Also ich sehe 11 Zahlen :o
Also ich kann in dem Muster weitaus mehr als 11 Zahlen sehen. Aber nur 11 aufeinanderfolgende Ziffern.
Matheaufgabe zum Wochenende: Wieviel Zahlen können in obiger Ziffernfolge enthalten sein?
dedlfix.
Hi,
Matheaufgabe zum Wochenende: Wieviel Zahlen können in obiger Ziffernfolge enthalten sein?
distinct oder nicht distinct? ;-)
cu,
Andreas a/k/a MudGuard
Hallo MudGuard,
distinct oder nicht distinct? ;-)
Kommt darauf an. Zum Beispiel gibt es eine rote und eine blaue 5. ;-)
Bis demnächst
Matthias
Tach!
Matheaufgabe zum Wochenende: Wieviel Zahlen können in obiger Ziffernfolge enthalten sein?
distinct oder nicht distinct? ;-)
Weiß grad nicht, was du damit meinst. Ich bin jetzt mal wie ein durchschnittlicher Auftraggeber und hab da nur eine Idee zu einer Knobelaufgabe, ohne mich genauer damit beschäftigt zu haben, was eigentlich rauskommen soll und was nicht. Ihr als Ausführende dürft dabei auch gern feststellen, wo die Aufgabe ungenau formuliert ist und welche Lösungswege und -möglichkeiten sich ergeben, an die der Auftraggeber gar nicht gedacht hat.
dedlfix.
Hi,
Matheaufgabe zum Wochenende: Wieviel Zahlen können in obiger Ziffernfolge enthalten sein? distinct oder nicht distinct? ;-)
Weiß grad nicht, was du damit meinst.
Die Ziffernfolge 25354748911 enthält mehrfach die Zahlen (wirklich Zahlen) 5, 4 und 1.
Wird die erste Zahl 5 und die zweite Zahl 5 getrennt gezählt, so daß es zwei Zahlen sind? Oder wird die Zahl 5 nur einmal gezählt?
cu,
Andreas a/k/a MudGuard
Tach!
Die Ziffernfolge 25354748911 enthält mehrfach die Zahlen (wirklich Zahlen) 5, 4 und 1.
Wird die erste Zahl 5 und die zweite Zahl 5 getrennt gezählt, so daß es zwei Zahlen sind? Oder wird die Zahl 5 nur einmal gezählt?
Interessanter Fakt. Da wird sich wohl eine Lösung nicht nur auf das Finden einer kombinatorischen Formel beschränken, sondern man muss die Lösungsmenge auch noch anhand der konkreten Ziffernkombinationen auf Doppelgänger flöhen, wenn es distict sein soll.
Tja, solche Fragen lassen sich grad nicht klären. Der Auftraggeber ist nicht erreichbar, die Lösung muss aber bis Montag verfügbar sein. Kennt man ja nicht anders ;)
dedlfix.
Hallo dedlfix,
Interessanter Fakt. Da wird sich wohl eine Lösung nicht nur auf das Finden einer kombinatorischen Formel beschränken, sondern man muss die Lösungsmenge auch noch anhand der konkreten Ziffernkombinationen auf Doppelgänger flöhen, wenn es distict sein soll.
Naja, so viele Varianten gibts da ja nicht. Wenn es Teilfolgen sein sollen, sind es erschreckend wenige Möglichkeiten.
Bis demnächst
Matthias
Tach!
Interessanter Fakt. Da wird sich wohl eine Lösung nicht nur auf das Finden einer kombinatorischen Formel beschränken, sondern man muss die Lösungsmenge auch noch anhand der konkreten Ziffernkombinationen auf Doppelgänger flöhen, wenn es distict sein soll.
Naja, so viele Varianten gibts da ja nicht. Wenn es Teilfolgen sein sollen, sind es erschreckend wenige Möglichkeiten.
Nicht wenn ich ignoriere, dass du der Färbung der Ziffern eine Bedeutung beigemessen hast und stattdessen die Grenzen der Zahlen an beliebigen Positionen sein können.
dedlfix.
Hallo dedlfix,
Nicht wenn ich ignoriere, dass du der Färbung der Ziffern eine Bedeutung beigemessen hast und stattdessen die Grenzen der Zahlen an beliebigen Positionen sein können.
Wenn die Reihenfolge der Ziffern bleibt (es also Teilfolgen sind), gibt es
11 1-stellige Zahlen, davon 3 doppelt,
10 2-stellige,
9 3-stellige,
8 4-stellige,
7 5-stellige,
6 6-stellige,
5 7-stellige,
4 8-stellige,
3 9-stellige,
2 10-stellige,
1 11-stellige Zahl
Bis demnächst
Matthias
Tach!
Wenn die Reihenfolge der Ziffern bleibt (es also Teilfolgen sind), gibt es
11 1-stellige Zahlen, davon 3 doppelt, 10 2-stellige, 9 3-stellige, 8 4-stellige, 7 5-stellige, 6 6-stellige, 5 7-stellige, 4 8-stellige, 3 9-stellige, 2 10-stellige, 1 11-stellige Zahl
Hmm, wenn dir da mal nicht der kleine Gauss bei der Lösungsfindung Pate gestanden hat. Du könntest Recht haben und ich stehe nun da wie sein Mathelehrer, der eigentlich eine ruhige Stunde verbringen wollte.
dedlfix.
Hi,
<input type="text" pattern="[0-9](?!00000)\d{5}">
Ich möchte erreichen, dass man keine 00000 eingeben kann,
Das sollte gegeben sein. Du verlangst ja 6 Ziffern (eine für [0-9], 5 für \d{5}).
Damit ist die Eingable von 00000 (also 5 mal die 0) nicht erlaubt. Ziel erreicht.
cu,
Andreas a/k/a MudGuard
Schlechte Laune oder was ist los? Du weißt doch ganz genau, dass der TO diese Antwort nicht gebrauchen kann.
Tach!
Schlechte Laune oder was ist los? Du weißt doch ganz genau, dass der TO diese Antwort nicht gebrauchen kann.
Man kann Kritik auch freundlich äußern, ohne den zu Kritisierenden mit Unterstellungen anzugehen. Spitzfindig kann man auch sein, wenn man äußerst gute Laune hat.
dedlfix.
Hallo dedlfix,
Schlechte Laune oder was ist los? Du weißt doch ganz genau, dass der TO diese Antwort nicht gebrauchen kann.
Man kann Kritik auch freundlich äußern, ohne den zu Kritisierenden mit Unterstellungen anzugehen. Spitzfindig kann man auch sein, wenn man äußerst gute Laune hat.
Außerdem war es ein zielführender Hinweis.
Bis demnächst
Matthias
Ich möchte erreichen, dass man keine 00000 eingeben kann, eine 0 am Anfang darf erlaubt sein.
Also 5 Ziffern, aber mindestens eine beliebige Stelle muss 1-9 sein. Partout als Regex.
"Fingerbieg und ab dafür":
<input type="text" pattern="^[1-9]\d{4}$|^\d[1-9]\d{3}$|^\d{2}[1-9]\d{2}$|^\d{3}[1-9]\d$|^\d{4}[1-9]$">
Hallo Regina Schaukrug,
"Fingerbieg und ab dafür":
<input type="text" pattern="^\d[1-9]\d{3}$|^\d{2}[1-9]\d{2}$|^\d{3}[1-9]\d$|^\d{4}[1-9]$">
ja bzw. (?!00000)\d{5}
Die Begrenzer sind im HTML-Attribut imho nicht notwendig.
Bis demnächst
Matthias
ja bzw.
(?!00000)\d{5}
Die Begrenzer sind im HTML-Attribut imho nicht notwendig.
Deine Lösung ist sogar schneller. Ich habe meinen Browser beauftragt, sich https://regex101.com/ gut zu merken.
Zu den Begrenzern. Die mögen zwar im HTML-Attribut nicht notwendig sein. Aber so kann ich folgendes machen:
<?php
# file: presets.php
$pattern = '^(?!00000)\d{5}$';
#...
require 'presets.php';
#...
<input pattern="<?=$pattern;?>" name="test">
#...
und auswerten:
require 'presets.php';
if (! preg_match( $pattern) , $_POST['test'] ) ) {
# Fehler bei PLZ
}
Hallo Regina Schaukrug,
require 'presets.php'; if (! preg_match( $pattern) , $_POST['test'] ) ) { # Fehler bei PLZ }
An eine PLZ-Prüfung hatte ich zunächst auch gedacht. Allerdings gibt es a) keine PLZ mit mehr als einer führenden Null, aber b) Leute, deren Wohnort die PLZ 00000 hat.
Bis demnächst
Matthias
Hallo Regina Schaukrug,
require 'presets.php'; if (! preg_match( $pattern) , $_POST['test'] ) ) { # Fehler bei PLZ }
An eine PLZ-Prüfung hatte ich zunächst auch gedacht.
Ja. Wäre logisch.
Allerdings gibt es a) keine PLZ mit mehr als einer führenden Null,
Stimmt.
Neuer Pattern: (?!^00000$)(?!^00\d\d\d$)^\d{5}$
Ich widerspreche. Die Quelle sagt:
"Da es keine offizielle Postleitzahl für diesen Bezirk gibt, wurde im Fahrzeugschein des Wirts die 00000 als Postleitzahl eingetragen."
Klar. Das kam nicht an, weil die PLZ 00000 nicht vergeben ist. Das die PLZ amtlich in einem Fahrzeugschein steht bedeutet nicht, dass diese PLZ auch gültig ist. An der Quelle heisst es weiter:
"Postsendungen an das Lokal und das Wirts-Paar gingen regelmäßig als unzustellbar zurück, weshalb man sich ein Postfach im Postamt des niedersächsischen Nachbarortes Hann. Münden zulegte."
Hallo Regina Schaukrug,
Neuer Pattern: (?!^00000$)(?!^00\d\d\d$)^\d{5}$
Das Prüfen der Gültigkeit von PLZ auf eine solche Weise kann man sich sparen, weil nicht jede formal gültige PLZ auch vergeben ist. Ich würde auf real existierende Kombinationen von PLZ und Wohnort prüfen.
Bis demnächst
Matthias
Ich würde auf real existierende Kombinationen von PLZ und Wohnort prüfen.
Erst auf dem Server weil (mir) die Übertragung derartiger Datenmengen für diesen Zweck nicht sinnvoll erscheint. Da sind wir irgendwie bei PL und seinem nicht ganz zu Recht derart negativ bewertetem Beitrag.
Übrigens könnte man auch die Google-API nutzen und die gesamte Adresse (auch die Straße!) verifizieren, sogar korrigieren. Bei Projekten mit mehr als "drei" Abfragen pro Tag braucht man dafür aber einen (kostenpflichtigen) Key und es stellt sich die Frage nach dem Datenschutz.
Wobei der sich demnächst 1984-mäßig "verbessert".
Hallo Regina Schaukrug,
Ich würde auf real existierende Kombinationen von PLZ und Wohnort prüfen.
Erst auf dem Server weil (mir) die Übertragung derartiger Datenmengen für diesen Zweck nicht sinnvoll erscheint.
Oder mithilfe von Ajax. Die PLZ wird eingegeben und für das Orts-Eingabefeld werden alle möglichen Orte in einer Auswahlliste vorgeschlagen, falls es keine gibt, erscheint „ungültige Postleitzahl“. Damit können aber Marlies und Reinhold kein gültiges Formular absenden.
Bis demnächst
Matthias
Oder mithilfe von Ajax. Die PLZ wird eingegeben und für das Orts-Eingabefeld werden alle möglichen Orte in einer Auswahlliste vorgeschlagen,
Und wenn der Server mal 3/10 Sekunden "hängt" wird die Formularbedienung so besch....eiden wie ich das erst neulich mal hatte. Ach ja: Auf bahn.de. Die versuchen verzweifelt per Ajax den Ortsname zu einem Bahnhof, Haltestelle oder Anschrift vervollständigen...
Für mich stellt sich bei solchen Dingen eher die Frage nach der Zumutbarkeit. Lass doch den Benutzer selbst entscheiden, ob seine Eingaben richtig sind und wie die genaue Adresse lautet. In Fakt reicht eine Textarea wo eine Adresse so reingeschrieben wird wie auf einen Briefumschlag.
Wozu einen Kunden wegen fehlerhaften Eingaben gängeln? Eine Sendung mit PLZ D-99091 kommt genausogut an wie eine PLZ ohne D.
Wenn eine Sendung mal nicht ankommt, liegt das schließlich im Verantwortungsbereich des Kunden. Und im Zweifelsfall gibts auch noch andere Wege zur Kommunikation (Telfon, eMail, Flaschenpost...).
Also Leute, machts doch nicht so kompliziert.
PS: Auch die PDF-Erstellung für Rechnungen o.ä. wird einfacher.
Tach!
Wenn eine Sendung mal nicht ankommt, liegt das schließlich im Verantwortungsbereich des Kunden. Und im Zweifelsfall gibts auch noch andere Wege zur Kommunikation (Telfon, eMail, Flaschenpost...).
Durchaus ist das des Kundens Verantwortung. Aber wenn wegen solcher Fehler Rückläufer kommen, ist das für beide Seiten ärgerlich. Der Kunde schimpft auf das Unternehmen, das nicht wie versprochen geliefert hat und das Unternehmen muss Zeit wegen solcher Rückläufer und vielleicht nochmalige Versandkosten aufwenden. Das macht die Produkte für den Rest der Kunden nicht billiger. Ein Unternehmen wird wohl kaum dem Kunden sagen wollen, dass er nun nochmal Versandkosten bezahlen soll. Eine Prüfung der Adresse auf Richtigkeit ist also sicher kein unnötig betriebener Aufwand.
dedlfix.
Hi,
Wozu einen Kunden wegen fehlerhaften Eingaben gängeln? Eine Sendung mit PLZ D-99091 kommt genausogut an wie eine PLZ ohne D.
U.U. braucht man aber eine korrekte Adresse, weil man diese an eine Schnittstelle weitergeben will/muß. Z.B. an eine Bonitätsprüfungs-Schnittstelle. Oder an die Schnittstelle eines anderen Kooperationspartners.
Wenn Du nur einen unformatierten String bekommst, wird das lustig mit dem Zerlegen in die Bestandteile (Straße, Hausnummer, PLZ, Ort)
Es gibt so viele Varianten - "Straße 5 17". Die 5 gehört zum Straßennamen (gibt's in Berlin). "A1 7". Mannheim. "Straße des 17. Juni 3a". "A 1" (Elster-Trebnitz). Usw.
Straßennamen (auch innerhalb einer PLZ) genügen auch nicht der Fano-Bedingung - ein gültiger Straßenname kann der Anfang eines anderen Straßennamens sein. A la "Markt" und "Marktplatz".
Und um die Sache noch komplizierter zu machen, gibt's auch Ziffern in Ortsnamen. Und zwar je nach Gusto auch noch römische Ziffern. Was die Kunden aber nicht davon abhält, statt arabischer Ziffern römische und statt römischer Ziffern arabische zu verwenden.
cu,
Andreas a/k/a MudGuard
Wenn Du nur einen unformatierten String bekommst, wird das lustig mit dem Zerlegen in die Bestandteile (Straße, Hausnummer, PLZ, Ort)
Die Google-Api kann das sehr gut:
Rein:
Raus:
Oder direkt:
http://maps.googleapis.com/maps/api/geocode/json?address=c+7+5+Mannheim
Es ist etwas schief gelaufen.
(Ich kann den Beitrag nicht bearbeiten)
Für mich stellt sich bei solchen Dingen eher die Frage nach der Zumutbarkeit. Lass doch den Benutzer selbst entscheiden, ob seine Eingaben richtig sind und wie die genaue Adresse lautet. In Fakt reicht eine Textarea wo eine Adresse so reingeschrieben wird wie auf einen Briefumschlag.
Soso. Dann implementiere mit Deiner Textarea z.B. mal eine DHL oder UPS-Schnittstelle. Kopfschüttel
Hi,
Das Prüfen der Gültigkeit von PLZ auf eine solche Weise kann man sich sparen, weil nicht jede formal gültige PLZ auch vergeben ist. Ich würde auf real existierende Kombinationen von PLZ und Wohnort prüfen.
Es ist aber nicht jede gültige PLZ mit einem Wohnort verknüpft.
Soweit mir bekannt behält eine Firma, die eine eigene PLZ bekommen hat, diese auch, wenn sie den Standort wechselt.
Und in den wenigsten Postfach-Räumen wohnt jemand - ist also auch kein Wohnort.
cu,
Andreas a/k/a MudGuard
Hallo Regina Schaukrug,
ja bzw.
(?!00000)\d{5}
Die Begrenzer sind im HTML-Attribut imho nicht notwendig.
Deine Lösung ist sogar schneller. Ich habe meinen Browser beauftragt, sich https://regex101.com/ gut zu merken.
Schneller ist eine Frage des zu prüfenden Strings. Die lange Variante braucht für 12345 nur 3 Schritte, die kurze jedoch 7. Bei 00000 sind es 70 bzw. 32.
Bis demnächst
Matthias