Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] MySQL und Regexpr Problem

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • [Erledigt] MySQL und Regexpr Problem

    Hallo,

    Habe ein Problem mit MySQL REGEXP. Ich habe schweizer und ausländische Postleitzahlen in meiner MySQL Datenbank, welche ich nach Regionen ausgeben muss. Die Postleitzahlen können mit irgendwelchen nicht numerische Werte z.B. mit CH-, DE- oder (BL) beginnen. Ich bringe es einfach nicht fertig das Suchmuster für nicht numerische Zeichen zu ergänzen. Habe jegliche Varianten mit \D, [^0-9] und * probiert.

    Es geht um folgende MySQL Abfrage (für PLZ 5000-5999):

    Code:
    SELECT * FROM `tabellenname` WHERE `PLZ` REGEXP '[^0-9]*5[0-9]{3}$';
    Bei diesem REGEXP wird D- 35428 ebenfalls ausgegeben, was es nicht sollte.

    Wäre froh für jede Idee oder Lösung.

    Danke.


  • #2
    Du möchtest das Suchmuster auch noch am Anfang verankern, nicht nur am Ende.

    Und nächstes mal bitte sinnvollen Beispielcode posten, keinen syntaktisch fehlerhaften. Und Code-Tags nutzen.

    Kommentar


    • #3
      Zitat von ChrisB Beitrag anzeigen
      Du möchtest das Suchmuster auch noch am Anfang verankern, nicht nur am Ende.
      Nicht ganz, der Anfang kann (muss aber nicht) mit irgendwelchen nicht numerischen Zeichen beginnen.

      Zitat von ChrisB Beitrag anzeigen
      Und nächstes mal bitte sinnvollen Beispielcode posten, keinen syntaktisch fehlerhaften. Und Code-Tags nutzen.
      Sorry, hier der gesamte SQL Code:

      Code:
      SELECT * FROM `tabellenname` WHERE `PLZ` REGEXP '[^0-9]*5[0-9]{3}$';

      Kommentar


      • #4
        Zitat von webconstructor Beitrag anzeigen
        Nicht ganz, der Anfang kann (muss aber nicht) mit irgendwelchen nicht numerischen Zeichen beginnen.
        Für das „kann, muss aber nicht“ sorgt bereits der Quantifier *, der auch Null Zeichen erlaubt.

        Kommentar


        • #5
          Zitat von ChrisB Beitrag anzeigen
          Für das „kann, muss aber nicht“ sorgt bereits der Quantifier *, der auch Null Zeichen erlaubt.
          Der Quantifier ist nicht das Problem. Sondern, dass es zu Begin nicht numerische Werte haben darf. Im Moment gibt die Ausgabe auch D- 35428 aus, was nicht sein soll. Das in Klammern (D- 3)5428 sollte der Reguläre Ausdruck überspringen da (D- 3) eine Nummer enthält. Mit
          Code:
          SELECT * FROM `tabellenname` WHERE `PLZ` REGEXP '[^0-9]*5[0-9]{3}$';
          oder
          Code:
          SELECT * FROM `tabellenname` WHERE `PLZ` REGEXP '[\D]*5[0-9]{3}$';
          oder
          Code:
          SELECT * FROM `tabellenname` WHERE `PLZ` REGEXP '(\D*)5[0-9]{3}$';
          funktionierts einfach nicht.
          Code:
          \D
          steht für Not digit (keine Zahlen).
          Code:
          [^0-9]
          steht für alle Zeichen ausser 0-9.

          Kommentar


          • #6
            Nimm + statt *, wenn du mindestens einen nicht numerischen Wert da stehen haben willst... oder lass den Quantifier ganz weg, da dies ja dein erstes zu findendes Zeichen ist und du eben kein ^ am Anfang benutzt.
            @fschmengler - @fschmengler - @schmengler
            PHP Blog - Magento Entwicklung - CSS Ribbon Generator

            Kommentar


            • #7
              Zitat von webconstructor Beitrag anzeigen
              Der Quantifier ist nicht das Problem.
              Hab ich auch nicht behauptet.

              Sondern, dass es zu Begin nicht numerische Werte haben darf. Im Moment gibt die Ausgabe auch D- 35428 aus, was nicht sein soll. Das in Klammern (D- 3)5428 sollte der Reguläre Ausdruck überspringen da (D- 3) eine Nummer enthält.
              Code:
              SELECT
              'D- 35428' REGEXP '^[^0-9]*5[0-9]{3}$',
              '35428'    REGEXP '^[^0-9]*5[0-9]{3}$',
              '5428'     REGEXP '^[^0-9]*5[0-9]{3}$',
              'CH5428'   REGEXP '^[^0-9]*5[0-9]{3}$'
              - das liefert für die ersten beiden jeweils 0 (kein Treffer), und für die anderen beiden 1.

              Wenn das nicht das ist, was du haben willst - dann liefere bitte mal ein paar mehr Beispieldaten und jeweils gewünschtes Ergebnis.

              Kommentar


              • #8
                Erledigt

                Zitat von ChrisB Beitrag anzeigen
                Code:
                SELECT
                'D- 35428' REGEXP '^[^0-9]*5[0-9]{3}$',
                '35428'    REGEXP '^[^0-9]*5[0-9]{3}$',
                '5428'     REGEXP '^[^0-9]*5[0-9]{3}$',
                'CH5428'   REGEXP '^[^0-9]*5[0-9]{3}$'
                - das liefert für die ersten beiden jeweils 0 (kein Treffer), und für die anderen beiden 1.

                Wenn das nicht das ist, was du haben willst - dann liefere bitte mal ein paar mehr Beispieldaten und jeweils gewünschtes Ergebnis.
                Danke Vielmals! So geht's, das suchte ich.

                Diese Regex sind mir nicht so geläufig

                Danke nochmals.

                Kommentar


                • #9
                  Dann bitte nächstes Mal erst nachdenken, bevor du den vollkommen zielführenden Hinweis mit „nicht ganz, ...“ abtust.

                  Kommentar


                  • #10
                    Als Dankeschön, werde ich Morgen eine Funktion, wo diese Lösung in Anwendungen kommt, posten, wenn nicht unerwünscht.

                    Einen schönen abend!

                    Kommentar


                    • #11
                      Zitat von ChrisB Beitrag anzeigen
                      Dann bitte nächstes Mal erst nachdenken, bevor du den vollkommen zielführenden Hinweis mit „nicht ganz, ...“ abtust.
                      Sorry, habe wirklich nicht nachgedacht, hätte schreiben sollen, dass ich dich nicht ganz verstehe.

                      Kommentar


                      • #12
                        Funktion um nach Regionen mithilfe von Postleitzahlen zu filtrieren

                        Hier noch die versprochene Funktion, welche eine MySQL Where String zurückgibt um mit Postleitzahlen nach Regionen zu filtrieren. Sie gibt einen String zurück, welchen nach dem WHERE einer MySQL queries angehängt werden kann. Siehe Beispiele weiter unten.

                        PHP-Code:
                        /**
                         * Query für Suche nach Regionen, ableitend von Postleitzahlen
                         * 
                         * Funktion, die einen String zurück gibt, welche einem "WHERE MySQL-Query" angehängt werden kann,
                         * um Postleitzahlen nach Regionen zu filtrieren. 
                         * 
                         * @param $column string Datenbank Reihe, welche die Postleitzahlen beinhaltet
                         * @param $regionArray array oder string nach welche(n) Region(en) gefiltert werden sollen
                         * @param $debug bool Debuggen true oder false
                         * @return string query welche dem WHERE einer MySQL Abfrage angehängt werden kann.
                         */


                        function getCityCodeWhere($column,$regionArray='all',$debug=false){
                            
                            
                        //Konfigurationen der verschiedenen Regionen
                            
                            
                        $cityCodesConf = array ('Zürich' =>'^[^0-9]*8[0-9^2]{1}[0-9]{2}([^0-9]*)$',
                                                    
                        'Schaffhausen' =>'^[^0-9]*82[0-9]{2}([^0-9]*)$',
                                                    
                        'Luzern' =>'^[^0-9]*6[0-2]{1}[0-9]{2}([^0-9]*)$',
                                                    
                        'Zug' =>'^[^0-9]*6[3-4]{1}[0-9]{2}([^0-9]*)$',
                                                    
                        'Basel' =>'^[^0-9]*4[0-4]{1}[0-9]{2}([^0-9]*)$',
                                                    
                        'Olten' =>'^[^0-9]*46[0-9]{2}([^0-9]*)$',
                                                    
                        'Solothurn' =>'^[^0-9]*45[0-9]{2}([^0-9]*)$',
                                                    
                        'Aarau' =>'^[^0-9]*5[0-9]{3}([^0-9]*)$',
                                                    
                        'St.Gallen / Appenzell' =>'^[^0-9]*9[0-9]{3}([^0-9]*)$',
                                                    
                        'Jura' =>'^[^0-9]*2[0-9]{3}([^0-9]*)$',
                                                    
                        'Tessin' =>'^[^0-9]*6[5-9]{1}[0-9]{2}([^0-9]*)$',
                                                    
                        'Ausland' =>'^[^0-9]*[0-9]{5,}([^0-9]*)$'
                                            
                        );
                            
                            
                        //Einzelne WHERE's in $cityCodesWheres speichern
                                
                            
                        if ($regionArray!='all'){
                                if (!
                        is_array($regionArray)){
                                    
                        $regionArray = array($regionArray);
                                }

                                
                        $cityCodesWheres = array();
                                
                                
                        //nur die Daten welche in $cityCodesWheres einlesen welche mit $regionArray übereinstimmen
                                
                        foreach($regionArray as $regionName){
                                    
                        $add=false;
                                    if (isset(
                        $cityCodesConf[$regionName]))$add=true;
                                    if (
                        $add){
                                        
                        //WHERE Segment mit Regulärer Ausdruck der übereinstimmende Region dazufügen
                                        
                        $cityCodesWheres[] = $column.' REGEXP \''.$cityCodesConf[$regionName].'\'';
                                    }
                                    if (
                        $add==false&&$debug==true){
                                        echo 
                        'Region : '.$regionName.' nicht gefunden!<br />';
                                    }
                                }
                                if (
                        count($cityCodesWheres)>0){
                                    
                        //WHERE String zurückgeben
                                    
                        return implode(' OR ',$cityCodesWheres);
                                }else{
                                    if (
                        $debug){
                                        echo 
                        'Keine übereinstimmende Regionen!<br />';    
                                    }
                                    return 
                        '';
                                }
                            }else{
                                
                        //$regionArray == 'all' -> kein Filter
                                
                        return "";
                            }
                            return;

                        Beispiel:

                        Beispiel 1. Eine Region
                        PHP-Code:
                        $query 'SELECT * FROM `tabellenName` WHERE '
                        //Where Filter String der Funktion dem String Query anhängen
                        $query .= getCityCodeWhere('PLZ','Aarau').';';
                        echo 
                        $query;
                        //Ausgabe: SELECT * FROM `tabellenName` WHERE PLZ REGEXP '^[^0-9]*5[0-9]{3}([^0-9]*)$'; 
                        Beispiel 2. Mehrere Regionen
                        PHP-Code:
                        $query 'SELECT * FROM `tabellenName` WHERE '
                        //Mehrere Regionen in einem array
                        $query .= getCityCodeWhere('PLZ',array('Zürich','Basel','Luzern')).';';
                        echo 
                        $query;
                        //Ausgabe: SELECT * FROM `tabellenName` WHERE PLZ REGEXP '^[^0-9]*8[0-9^2]{1}[0-9]{2}([^0-9]*)$' OR PLZ REGEXP '^[^0-9]*4[0-4]{1}[0-9]{2}([^0-9]*)$' OR PLZ REGEXP '^[^0-9]*6[0-2]{1}[0-9]{2}([^0-9]*)$'; 

                        Kommentar

                        Lädt...
                        X