Figgifiggi: Regexp + Tabelle

Bin neu in JavaScript finde den Fehler nicht, lg Figgi

<body>
<input id="street" type="text" placeholder="Straße Hausnummer PLZ Ort Land">
<button onclick="validate()">Test</button>
<table id="marks">

</body>
<script>
"use strict";

function tabelle() {
const MY_ROWS = document.getElementById("marks").getElementsByTagName("tr");
for (let k in MY_ROWS) {
if (k % 2 === 1 ) {
MY_ROWS [k].style.backgroundColor = "RED";
}
}
}
tabelle();

function validate()
{
const adresse = document.getElementById("street").value;
const regExp = /^[A-ZÄÖÜ][A-ZÄÖÜa-zäöüß-\s]* \d+[a-z]?(-\d+[a-z]?)? \d{5} [A-Z][A-ZÄÖÜa-zäöüß-\s]* [A-Z][A-ZÄÖÜa-zäöüß-\s]*$/;
let test = regExp.test(adresse);
if (test) {

document.getElementById("street").style.backgroundColor = "green";
document.getElementById("street").style.color = "white";
}
else {

document.getElementById("street").style.backgroundColor = "red";
document.getElementById("street").style.color = "white";
}
console.log(test);
}
</script>
  1. Hallo Figgifiggi,

    Bin neu in JavaScript finde den Fehler nicht, lg Figgi

    Interessante Feststellung — und nu?

    Bitte zeichne deinen Code als Code aus. Oberhalb des Texteingabefeldes gibt es ein paar Buttons, die helfen könnten.

    Bis demnächst
    Matthias

    --
    Pantoffeltierchen haben keine Hobbys.
  2. Hi,

    Bin neu in JavaScript finde den Fehler nicht, lg Figgi

    Bin nicht neu in Javascript, finde aber Deine Fehlerbeschreibung nicht.

    const regExp = /[1][A-ZÄÖÜa-zäöüß-\s]* \d+[a-z]?(-\d+[a-z]?)? \d{5} [A-Z][A-ZÄÖÜa-zäöüß-\s]* [A-Z][A-ZÄÖÜa-zäöüß-\s]*$/;

    Soll das sowas wie 'Straße Hausnummer PLZ Ort' matchen?

    Die Range ß-\s ergibt keinen Sinn. Wenn das - keinen Range bedeuten soll, muß es als erstes oder als letztes Zeichen in den [] stehen.

    Gehen wir also mal von dem hier aus:
    ^[A-ZÄÖÜ][A-ZÄÖÜa-zäöüß\s-]* \d+[a-z]?(-\d+[a-z]?)? \d{5} [A-Z][A-ZÄÖÜa-zäöüß\s-]* [A-Z][A-ZÄÖÜa-zäöüß-\s]*$

    Damit schließt Du viele gültige deutsche Adressen aus. Es gibt z.B. Straßen mit Ziffern mittendrin (Straße des 17. Juni). Ups, der Punkt wird ja auch nicht erlaubt - häufiger als mittendrin dürfte der Punkt am Ende der Straße vorkommen, weil die mit 'str.' abgekürzt wird.

    Ach ja, im Ortsnamen kann auch ein Punkt vorkommen (z.B. 'Hann. Münden', oder in nach Heiligen benannten Orten ('St. Peter').

    Du verlangst, daß der Ortsnmae aus mindestens 2 Teilen besteht? Oder soll der letzte Buchstabenhaufen ein Land sein? Dann macht aber die Festlegung der PLZ auf 5 Ziffern keinen Sinn (Österreich hat z.B. nur 4 Ziffern in der PLZ, Großbrexitannien hat 6 Stellen mit Buchstaben und Ziffern, …)

    Immerhin erlaubst Du einstellige Straßennamen (gibt's z.B. in Elster-Trebnitz). Aber Mannheims Innenstadt kommt nicht durch - ('A 1'), aber auch viele Straßen in Berlin ('Straße 5') usw.

    Akzentierte Zeichen verbietest Du auch (Carl-von-Linné-Str.). Und das ' magst Du auch nicht (u.a. "Auf'm Herz" in 35287 Amöneburg)

    Usw.

    cu,
    Andreas a/k/a MudGuard


    1. A-ZÄÖÜ ↩︎

    1. Moin,

      bei Wikipedia steht etwas Interessantes zu Hausnummer und -ergänzungen. Gültig sind in Deutschland u.a.

      • 1-2
      • 23 e
      • 5b
      • 3/4
      • $$7 {}^1/_4 b$$

      Und dann gibt es noch so Städte wie Mannheim, deren Adressen auch mal Q6 lauten können.

      Viele Grüße
      Robert

  3. Hallo Figgifiggi,

    Fehler 1: Deine Table beginnt, endet aber nicht. Sie enthält auch keine Rows. Was soll deine Schleife also verarbeiten? Aber ich nehme man an, dass Du das beim Posten weggelassen hast.

    Fehler 2: Dein input Element hat kein Label. Placeholder können keine Labels ersetzen.

    <label for="street">Adresse: </label>
    <input id="street" type="text" placeholder="Straße Hausnummer PLZ Ort Land">
    

    Fehler 3: Deine Adress-Regex ist untauglich. Wenn es eine Postanschrift sein soll, sind auch Postfachadressen oder Großkunden-PLZ möglich. Wenn es nicht Deutschland ist, ist eine 5-stellige PLZ falsch. Und in Mannheim ist sogar die Straße falsch. Google mal nach "Adresse Mannheim" und staune. Hausnummer allein reicht übrigens nicht bei der Straße, in Berlin hast Du Angaben wie 3. Hof oder so. In Bergisch Gladbach ist auch der Ort falsch. Kurz und schlecht: Lass das mit der Regex. Du kannst nicht alle Fälle erfassen. In England sind Adressen oft eher Wegbeschreibungen als formale Adressen.

    Und darum:

    Fehler 4: Wenn Du Struktur in Adressen bringen willst, mache 4 Eingabefelder. Straße, PLZ, Ort, Land. Lass die Finger von Plausiprüfungen, die Du nicht überschauen kannst. Erzwinge keine Straße - eine größere Firma hat ggf. nur PLZ und Ort.

    Wenn Du das nicht willst, mach kein input-Element, sondern eine textarea, damit er Kunde die Adresse so eingeben kann wie sie für seine Bedingungen richtig ist.

    Fehler 5: Benutze CSS für das Aussehen deiner Seite, keine inline Styles. Eine Tabelle, bei der jede zweite Zeile eine andere Hintergrundfarbe haben soll, lässt sich mit der nth-child Pseudoklasse ganz einfach im CSS erzeugen:

    Das folgende HTML ist unvollständig und zeigt nur die relevanten Teile.

    <head>
    <style>
      tr:nth-child(even) { background-color: red; }
    </style>
    </head>
    <body>
    <table>
    <tr><td>weiß</td></tr>
    <tr><td>rot</td></tr>
    <tr><td>weiß</td></tr>
    <tr><td>rot</td></tr>
    </table>
    </body>
    

    Und eigentlich wollte ich Dir ja noch das constraint validation API für selbstgemachte Prüfungen andienen, mit denen Du die :valid Pseudoklasse eines Elements steuern kannst, aber das streikt bei mir mal wieder. Das Feld wird zwar ungültig, aber die Fehlermeldung bekomme ich nicht. @Gunnar Bittersmann - gibt's da einen Trick zu beachten?

    Rolf

    --
    sumpsi - posui - clusi
    1. Hi,

      In Bergisch Gladbach ist auch der Ort falsch.

      Nö, Du hast das \s in der [] übersehen.

      Fehler 4: Wenn Du Struktur in Adressen bringen willst, mache 4 Eingabefelder. Straße, PLZ, Ort, Land.

      5 Eingabefelder. Die Hausnummer separat von der Straße. Ist später kaum wieder automatisch aufzutrennen, da es Straßen wie "Str. des 17. Juni" gibt oder eben "A 1" oder "Straße 5" oder …

      cu,
      Andreas a/k/a MudGuard

      1. @@MudGuard

        Fehler 4: Wenn Du Struktur in Adressen bringen willst, mache 4 Eingabefelder. Straße, PLZ, Ort, Land.

        5 Eingabefelder. Die Hausnummer separat von der Straße.

        Nö, bitte nicht. Als Nutzer hasse ich das wie die Pest. Und ich denke, anderen geht es auch so.

        Ist später kaum wieder automatisch aufzutrennen, da es Straßen wie "Str. des 17. Juni" gibt oder eben "A 1" oder "Straße 5" oder …

        Das ist richtig. Aber: in den meisten Fällen braucht man Straße und Hausnummer nicht getrennt. (PLZ-Ermittlung wäre ein Gegenbeispiel.)

        Und es ist auch nicht richtig. Richtig wäre: ist später kaum wieder automatisch von einem selbst aufzutrennen. Andere (die eine entsprechende Datenbank dahinter haben) können das. Open Street Maps beispielsweise.

        LLAP 🖖

        --
        „Wer durch Wissen und Erfahrung der Klügere ist, der sollte nicht nachgeben. Und nicht aufgeben.“ —Kurt Weidemann
    2. @@Rolf B

      Und darum:

      Fehler 4: Wenn Du Struktur in Adressen bringen willst, mache 4 Eingabefelder. Straße, PLZ, Ort, Land. Lass die Finger von Plausiprüfungen, die Du nicht überschauen kannst.

      Richtig.

      Es gibt aber andere, die das überschauen können. Open Street Maps bspw.

      Abfrage „Monumentenstraße 9 Berlin“
      (https://nominatim.openstreetmap.org/search?q=Monumentenstra%C3%9Fe%209%20Berlin&format=json&addressdetails=1)

      In der Antwort auf darauf findet sich dann:

      [
      	{,
      		"address": {
      			"theatre": "Scheinbar Varieté e.V.",
      			"house_number": "9",
      			"road": "Monumentenstraße",
      			"suburb": "Schöneberg",
      			"city_district": "Tempelhof-Schöneberg",
      			"city": "Berlin",
      			"postcode": "10829",
      			"country": "Deutschland",
      			"country_code": "de"
      		}
      	},]
      

      Und schon hat man alles fein säuberlich aufgetrennt – sogar Straße und Hausnummer.

      Wenn Du das nicht willst, mach kein input-Element, sondern eine textarea, damit er Kunde die Adresse so eingeben kann wie sie für seine Bedingungen richtig ist.

      Das ist für Nutzer wohl das am einfachsten zu bedienende: ein Eingabefeld, nicht vier. Und schon gar nicht fünf.


      Und eigentlich wollte ich Dir ja noch das constraint validation API für selbstgemachte Prüfungen andienen, mit denen Du die :valid Pseudoklasse eines Elements steuern kannst, aber das streikt bei mir mal wieder. Das Feld wird zwar ungültig, aber die Fehlermeldung bekomme ich nicht. @Gunnar Bittersmann - gibt's da einen Trick zu beachten?

      ?? Was genau?

      LLAP 🖖

      --
      „Wer durch Wissen und Erfahrung der Klügere ist, der sollte nicht nachgeben. Und nicht aufgeben.“ —Kurt Weidemann
      1. @@Gunnar Bittersmann

        Open Street Maps […] Und schon hat man alles fein säuberlich aufgetrennt – sogar Straße und Hausnummer.

        Wobei ich feststellen musste, dass in der Antwort von OSM nicht immer die house_number enthalten ist.

        Und der Ort kann statt city auch town oder village (…?) sein.

        LLAP 🖖

        --
        „Wer durch Wissen und Erfahrung der Klügere ist, der sollte nicht nachgeben. Und nicht aufgeben.“ —Kurt Weidemann
        1. Moin Gunnar,

          Und der Ort kann statt city auch town oder village (…?) sein.

          Vielleicht steckt da eine Größeninformation drin:

          • city als Großstadt
          • town als Kleinstadt
          • village als Dorf

          Aber das ist hoffentlich irgendwo dokumentiert.

          Viele Grüße
          Robert

          1. Es gibt Anschriften in Deutschland, die haben weder Straßennamen noch Hausnummern. Von daher schon sind diesbez. Pflichtfelder unsinnig.

            MfG

            1. Hi there,

              Es gibt Anschriften in Deutschland, die haben weder Straßennamen noch Hausnummern. Von daher schon sind diesbez. Pflichtfelder unsinnig.

              Und warum nennt sich das dann "Anschrift"? Ich bin ja ein großer Freund von Anonymität, aber das scheint mir als "Anschrift" eher untauglich. Hast Du da für Deine Behauptung ein Beispiel?

              1. Hallo klawischnigg,

                Es gibt Anschriften in Deutschland, die haben weder Straßennamen noch Hausnummern. Von daher schon sind diesbez. Pflichtfelder unsinnig.

                Und warum nennt sich das dann "Anschrift"? Ich bin ja ein großer Freund von Anonymität, aber das scheint mir als "Anschrift" eher untauglich. Hast Du da für Deine Behauptung ein Beispiel?

                Solche Adressen nennen sich Anschrift, weil man sie als Anschrift eines Poststücks verwenden kann. Beispiel: Postfächer.

                Viele Grüße
                Robert

              2. Hallo klawischnigg,

                Stadtverwaltung Köln
                50605 Köln
                

                Nennt man Großempfänger-PLZ

                Rolf

                --
                sumpsi - posui - clusi
          2. Servus!

            Moin Gunnar,

            Und der Ort kann statt city auch town oder village (…?) sein.

            Vielleicht steckt da eine Größeninformation drin:

            • city als Großstadt
            • town als Kleinstadt
            • village als Dorf

            Ja, hier eine imho gute Erklärung:

            tl;dr

            • town: populated areas with fixed boundaries and a local government. Towns are usually bigger than villages, but smaller than cities

            • city: large or important town.

              • In the United States, cities are incorporated municipalities with local governments.
              • In Great Britain, a borough with a bishop’s seat is called a city.

            Aber das ist hoffentlich irgendwo dokumentiert.

            wird irgendwie eher flexibel gehandhabt. Und: in den USA gibt's afair keine villages, sondern nur towns, wenn ganz klein, dann als one-horse-town.

            Herzliche Grüße

            Matthias Scharwies

            --
            "I don’t make typos. I make new words."
        2. Hi,

          Wobei ich feststellen musste, dass in der Antwort von OSM nicht immer die house_number enthalten ist.

          Und der Ort kann statt city auch town oder village (…?) sein.

          ich hab da jetzt mal ein paar Adressen durchgejagt.

          Mal kommt ein Eintrag, manchmal mehrere (mal mit gleichem, mal auch mit verschiedenen OSM_Type (way, node, place, ...)).

          Und der Straßenname landet manchmal statt in 'road' auch in 'residential'

          cu,
          Andreas a/k/a MudGuard

          1. Hi,

            Und der Straßenname landet manchmal statt in 'road' auch in 'residential'

            oder in 'path' oder in 'pedestrian'.

            cu,
            Andreas a/k/a MudGuard

        3. @@Gunnar Bittersmann

          Open Street Maps […] Und schon hat man alles fein säuberlich aufgetrennt – sogar Straße und Hausnummer.

          Wobei ich feststellen musste, dass in der Antwort von OSM nicht immer die house_number enthalten ist.

          Grummel, wie ich jetzt feststellen musste, kommt in der Antwort von OSM auch schon mal eine falsche PLZ.

          Ich schicke bspw. „An den Rotpfuhlen, 16540 Hohen Neuendorf“ hin (korrekte PLZ, das ist die letzte Straße in Hohen Neuendorf vor Bergfelde), in der Antwort kommt als PLZ 16562 – die von Bergfelde (was zur Gemeinde Hohen Neuendorf eingemeindet wurde, was den Fehler von OSM aber nicht besser macht).

          OSM kennt seine Grenzen nicht.

          LLAP 🖖

          --
          „Wer durch Wissen und Erfahrung der Klügere ist, der sollte nicht nachgeben. Und nicht aufgeben.“ —Kurt Weidemann
      2. Hallo Gunnar,

        Was genau

        Habe noch mal gesucht. Es ist wohl ein Chrome-Bug, dass der Text, der an setCustomValidity übergeben wird, nicht als Hover erscheint.

        Rolf

        --
        sumpsi - posui - clusi
    3. Moin,

      Ack!

      Also warum nicht einfach eine <textarea> und Fertig! Das macht es auch für den Benutzer einfacher!

      MfG

      1. Hi there,

        Also warum nicht einfach eine <textarea> und Fertig! Das macht es auch für den Benutzer einfacher!

        Weil die lieben Leute dann einfach alles 'reinschreiben. Das beste was ich in dem Zusammenhang je gesehen habe und herausklamüsern mußte war im Eingabefeld "Strasse" in einem Webshop auf italienisch geschrieben frei übersetzt: "im Falle meiner Abwesenheit das Paket nebenan bei Luigi abgeben"…