Ankündigung

Einklappen
Keine Ankündigung bisher.

optisch ähnliche Zeichen bei der mysqli-Abfrage berücksichtigen

Einklappen

Neue Werbung 2019

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

  • optisch ähnliche Zeichen bei der mysqli-Abfrage berücksichtigen

    Hallo,

    ich habe jetzt einige Stunden gegrübelt, wie man bei einer Datenbankabfrage (MYSQLi) optisch ähnliche Zeichen berücksichtigen kann. Ich weiß nicht, ob dieses Problem anders gelöst werden kann, aber ich habe eine Lösung für dieses Problem gefunden.

    Beispiel:
    Die Seriennummer eines Gegenstandes lautet "LOb123". Person X liest die Nummer irrtümlich als "L0bl23" ("Null" satt Buchstabe "O", kleines "l" statt "1") und trägt sie falsch in die Datenbank ein. Person Y sucht nach der richtigen Nummer "LOb123" und findet die von Person X falsch eingetragene Seriennummer "L0bl23" logischerweise nicht.

    zur Verdeutlichung des Problems mit dem falsch Ablesen:
    LOb123 - L0bl23
    LOb123 - L0bl23 (Font: Courier New)
    Bei meiner Recherche bin ich draufgekommen: Es gibt für die Suche in MYSQL nicht nur "=" und "LIKE" sondern auch "RLIKE". Mit "RLIKE" kann man beim SELECT-Query einen regulären Ausdruck einzubauen.

    Jetzt blieb nur noch die Frage offen, wie ich den regulären Ausdruck zusammenbauen kann.

    Das habe ich so gelöst:

    PHP-Code:
    <?php
     
     $search  
    '1 Orangutan und 6 Igel sind ein Segen, 6 Orangutan und 1 Igel sind eine Qual';
     
     function 
    conf_chars(){
      return array(
    '0QOo''1Il''2Z''5S''6G');
     }

     function 
    split_chars($chars){
      return 
    implode('|'str_split(implode($chars)));
     }

     if(
    preg_match('/('.split_chars(conf_chars()).')/'$search)){
      function 
    replace_conf_chars($matches){
       return 
    '('.split_chars(preg_grep('/'.$matches[0].'/'conf_chars())).')';
      }
      
    $rsearch preg_replace_callback('/('.split_chars(conf_chars()).')/''replace_conf_chars'$search);
     }else{
      
    $rsearch $search;
     }  
     
     echo 
    $rsearch;
     
    ?>
    (1|I|l) (0|Q|O|o)rangutan und (6|G) (1|I|l)ge(1|I|l) sind ein (5|S)egen, (6|G) (0|Q|O|o)rangutan und (1|I|l) (1|I|l)ge(1|I|l) sind eine (0|Q|O|o)ua(1|I|l)
    Jetzt muss man $rsearch nur noch in Verbindung mit RLIKE anwenden.

    Ich hoffe, dass ich jemandem damit helfen kann
    Kritik ist wie immer erwünscht!
    .

  • #2
    Update: habs nochmal verbessert Verbesserungsvorschläge?
    .

    Kommentar


    • #3
      Zitat von kremser Beitrag anzeigen
      Update: habs nochmal verbessert Verbesserungsvorschläge?
      Code:
      (0|Q|O|o)
      Kennen die Regulären Ausdrücke von MySQL keine Zeichenklassen?

      Code:
      [0QOo]
      Wenn man die Wurst schräg anschneidet, hält sie länger, weil die Scheiben größer sind.

      Kommentar


      • #4
        Ehrlichgesagt hab ich das nicht probiert, aber es funktioniert wahrscheinlich schon. Keine Ahnung warum ich darauf noch nicht gekommen bin
        .

        Kommentar


        • #5
          Funktioniert


          PHP-Code:
          <?php
           
           
          function mkreg_confusing_chars($search){
            if(!
          function_exists('conf_chars')){
             function 
          conf_chars(){
              return array(
          '0QOo''1Il''2Z''5S''6G');
             }
            }
            if(
          preg_match('/['.implode(conf_chars()).']/'$search)){
             if(!
          function_exists('replace_conf_chars')){
              function 
          replace_conf_chars($matches){
               return 
          '['.implode(preg_grep('/'.$matches[0].'/'conf_chars())).']';
              }
             }
             return 
          preg_replace_callback('/['.implode(conf_chars()).']/''replace_conf_chars'$search);
            }else{
             return 
          $search;
            }
           }
           
           
          // vv only for testing purposes 
           
           
          $search preg_replace('/[^a-z0-9 ]/i'''$_GET['search']);
           echo 
          '$search<br>';
           echo 
          '<b>'.$search.'</b><br>';
           echo 
          'mkreg_confusing_chars($search)<br>';
           echo 
          '<b>'.mkreg_confusing_chars($search).'</b>';
           echo 
          '<hr>';
           
          show_source(__FILE__);
           
          ?>
          Testen: http://tinyurl.com/n2cm8gj
          .

          Kommentar

          Lädt...
          X