Ankündigung

Einklappen
Keine Ankündigung bisher.

preg_match Suche nach variable geht nicht

Einklappen

Neue Werbung 2019

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

  • #16
    zu preg_quote()
    innerhalb von regulären Ausdrücken haben bestimmte Zeichen eine gewisse Aufgabe zu erfüllen.
    so ist das ? oder ein Punkt auch eine Anweisung an den REGEX PARSER.

    Siehe Liste (erster Kommentar weiter unten) http://www.php.net/manual/en/functio...tch.php#105924
    Wenn du also den Satz "wie alt bist du?" durch preg_match schickst sieht der Parser das ? nach dem u und interpretiert dieses als:
    u darf einmal oder gar nicht vorkommen,
    was in deinem pregmatch eine völlig andere Ausgabe erzeugen würde.

    Um dem aus dem Weg zu gehen werden solche Zeichen ersetzt, d.h. maskiert(escape) in dem ein \ Zeichen vor das Fragezeichen gestellt wird.
    PHP-Code:
    echo preg_quote("Wie alt bist du?"); // Wie alt bist du\? 
    Damit kann der REGEX PARSER nun den Satz korrekt verarbeiten.

    Falscheingaben und Validierung
    Wenn man ein Datum in einer Zeichenkette suchen will, dann muss man auch sicherstellen, dass ein Datum vorliegt.
    In der EDV-Welt gibt es nur ein Datum und das ist genormt.nach ISO 8601.
    Nun enthält deine Datei aber eine andere Schreibweise des Datums und dahin musst du dann erstmal konvertieren.

    Also Datum prüfen, konvertieren, nachsehen.

    Folgernder Code erledigt das alles für dich inklusive Ausgabe und Eingabeformular, diesmal ohne preg_match.

    PHP-Code:
    <?php

    $html_out 
    null;
    // Prüfen ob submit gedrückt wurde und Datum ausgefüllt
    if ( isset($_GET['submit'], $_GET['date']) ) {

        
    // Wird Datum als richtiges Format erkannt?
        
    if( $dt date_create($_GET['date']) ) {
            
    $date $dt->format('d.m.Y');  

            
    // erst jetzt Datei holen
            
    $csvarray file("protokoll.csv");

            
    // Datei Zeilenweise nach Datum durchsuchen
            
    foreach ( $csvarray as $line ) {
                if ( 
    strpos($line$date) !== false ) {
                    
    $html_out .= $line;
                    
    // alternativ kann hier auch fgetcsv() angewendet
                    // werden um die einzelnen Felder zu erhalten
                
    }else{
                    
    $html_out "Keine Übereinstimmung gefunden.";
                }    
            }
        }else{
            
    $html_out "Ungültiges Datum bei der Eingabe!";
        }
    }

    ?>

    <html>
    <head>
         <meta charset="UTF-8">
         <title>Registrierkasse</title>
    </head>
    <body>

    <h1>Auswertung der Protkolldaten</h1>

    <form lang="de">
        <label>Datum:
        <input name="date" type="date" pattern="\d{2}\.\d{2}\.\d{4}" placeholder="10.12.2010" required>
        </label>
        <input name="submit" type="submit" value="anzeigen">
    </form>
    <h2>Ergebnis:</h2>
    <textarea cols="75" rows="6"><?= $html_out?></textarea>

    </body>
    </html>

    Kommentar


    • #17
      Zitat von DAU19 Beitrag anzeigen

      jspitpreg_quote() Funktion ist mir noch nicht ganz klar, auch nach dem durchlesen :/ Wenn ich das richtig verstanden habe, ist die Maskierung dazu da, damit nichts weiteres in meine Variable hineininterpretaiert wird richtig? Also sichere ich mich dann somit sozusagen ab, dass etwas interpretiert wird was nicht sein soll?
      Fast.
      In einem regulären Ausdruck gibt es ja viele Zeichen, die eine Sonderstellung haben. Wenn solche Zeichen auch in deiner Variable sein können, müssen diese eben maskiert werden damit sie nur dieses Zeichen repräsentieren und nicht die Funktionalität im regulären Ausdruck erfüllen. Im Grunde handelt es sich hier auch um einen Kontextwechsel.

      Dazu noch ein Beispiel, da ein Maskieren bei der Benutzung von regulären Ausdrücken oft vergessen wird.
      Es soll getestet werden soll ob eine Formel den Operator * enthält:
      PHP-Code:
      // F a l s c h !
      $formel "12 * 16 / 5";
      $search "*";
      $res preg_match('/'.$search.'/'$formel$match);
      var_dump($res,$match); 
      Resultat:
      Warning: preg_match(): Compilation failed: nothing to repeat at offset 0 in /var/www/virtual/console.php on line 3
      bool(false) NULL

      Warum:
      Mit dem $search entsteht dieser falsche reguläre Ausdruck : /*/

      PHP-Code:
      // Richtig
      $formel "12 * 16 / 5";
      $search "*";
      $res preg_match('/'.preg_quote($search,'/').'/'$formel$match);
      var_dump($res,$match); 
      Resultat:
      int(1) array(1) { [0]=> string(1) "*" }

      Der zweite Parameter von preg_quote muss den benutzen Delimiter enthalten.

      LG jspit

      Kommentar

      Lädt...
      X