Ankündigung

Einklappen
Keine Ankündigung bisher.

Regex

Einklappen

Neue Werbung 2019

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

  • Regex

    Hallo, versuche mit folgendem Regex zu prüfen ob diese Zeichen im String vorkommen
    #1234'/\
    . Ich möchte nicht prüfen, ob diese Zeichen am Anfang sind, sondern überhaupt im String vorkommen. Leider scheitere ich daran. Ich glaubde irgendwas mit maskieren stimmt nicht.
    PHP-Code:
    <?php
    $zeichenkette 
    'testbla';

    if(
    preg_match('/[^#(0-4)'\/]+$/', $zeichenkette)){
    //bearbeitung: Leider ändert das forum den regex von mir, dieser müsste wie folgt aussehen
    // preg_match('
    /[^#(0-4)'\/]+$/', $zeichenkette)
    }


  • #2
    /[1-4#\/\\']*/

    #Tapatalk

    Kommentar


    • #3
      Zitat von Spamversender Beitrag anzeigen
      /[1-4#\/\\']*/

      #Tapatalk
      matcht einfach alles durch den *.

      Padal:
      prüfen ob diese Zeichen im String vorkommen
      reicht (mir) nicht aus um die Aufgabe eindeutig zu definieren.
      Möchtes du prüfen:
      a) ob eines dieser Zeichen irgendwo im String vorkommt
      b) ob alle diese Zeichen irgendwo im String vorkommen

      Dann liefere bitte mal sinnvollere Beispiele als 'testbla'.
      Und ein zur Aufgabe passender Titel wäre auch schön.
      PHP-Klassen auf github

      Kommentar


      • #4
        Code:
        $pattern = "/[1-4#\/\\\\']/";
        
        // oder
        
        $pattern = '/[1-4#\/\\\\\']/';
        
        // oder
        
        $pattern = '/[1-4#\/\x5c\']/';
        
        // oder (NOWDOC, nicht HEREDOC)
        
        $pattern = <<<'EOT'
        /[1-4#\/\\']/
        EOT;
        - http://php.net/manual/en/language.ty....syntax.double

        Der Punkt ist, dass der String, der schließlich an die Regex-Engine geht, so aussehen muss:

        Code:
        /[1-4#\/\\']/
        "\/" und "\\" sind dort Escape-Sequenzen, die die Regex-Engine versteht.

        Dummerweise ist "\\" aber auch eine Escape-Sequenz, die der PHP-Interpreter auswertet.

        Das heißt, ein String "/[1-4#\/\\']/" im PHP-Code würde von PHP schon so "/[1-4#\/\']/" umgewandelt, bevor er an die Regex-Engine weitergereicht würde.

        Die würde das dann als die Zeichen 1, 2, 3, 4, #, / und ' interpretieren.

        Deshalb ist in PHP-Code-Strings immer \\\\ zu schreiben, um tatsächlich das Zeichen Backslash in den Ausdruck zu bekommen. Man muss sozusagen durch das Escaping von PHP und durch das der Regex-Engine durch (zwei Level).

        Beziehungsweise kann man sich in single-quoted Strings auch mit '\x5c' behelfen. Das wäre dann eine Escape-Sequenz, die die Regex-Engine auswertet.

        In double-quoted Strings funktioniert das wiederum nicht, weil "\x5c" bereits auf PHP-Ebene ausgewertet wird.

        Dann gäbe es noch NOWDOC-Syntax, die genutzt werden könnte, um das Escaping, das der Parser von PHP in Strings vornimmt, ganz aus der Gleichung zu nehmen. Ist ungewöhnlich, aber vielleicht gar nicht schlecht für die Lesbarkeit.

        Helferfunktion:

        PHP-Code:
        <?php

        function whatDoesItMatch($pattern)
        {
            
        $output '';

            for (
        $index 0$index <= 127$index++) {
                
        $char chr($index);
                
        $match preg_match($pattern$char);

                if (
        === $match) {
                    
        $output .= sprintf("%s (0x%s)\n"$charbin2hex($char));
                }
            }

            return 
        $output;
        }

        echo 
        whatDoesItMatch('/[1-4#\/\x5c\']/');

        // # (0x23)
        // ' (0x27)
        // / (0x2f)
        // 1 (0x31)
        // 2 (0x32)
        // 3 (0x33)
        // 4 (0x34)
        // \ (0x5c)

        Kommentar


        • #5
          @jspit: Sorry, war gestern spät in der Nacht Nochmals zur Verdeutlichung: Ich möchte einen übergebenen String prüfen, und sobald eines dieser zeichen im string vorkommt (also nicht alle nacheinander) möchte ich false ausgeben. Hier mein Ergebnis dank euch. Kann man das noch verbessern?

          PHP-Code:
          $zeichenkette "Test\\";

          $pattern '/^[^1-4#\/\\\\\']+$/';

          if(
          preg_match($pattern$zeichenkette))
              echo 
          'true';
              else{
          echo 
          'false';

          @mermshaus: Vielen Dank für die detaillierte Beschreibung.

          Kommentar


          • #6
            Das sollte klappen. Oder eben das Pattern auf „fehlerhaftes Zeichen“ matchen lassen und nicht auf „kein fehlerhaftes Zeichen“.

            PHP-Code:
            $zeichenkette "Test";

            $pattern '/[1-4#\/\\\\\']/';

            if (
            === preg_match($pattern$zeichenkette)) {
                echo 
            'true';
            } else {
                echo 
            'false';

            Kommentar


            • #7
              Vielleich noch ne kleine Frage in dem Zusammenhang. Ich habe Probleme weitere Zeichen wie alle Arten von Klammern einzufügen. Also ()[]{} Könnt ihr mir da noch helfen?

              Kommentar


              • #8
                Indem du wieder escapst ^^ (\) {\}...

                Kommentar


                • #9
                  Zitat von Padal Beitrag anzeigen
                  Vielleich noch ne kleine Frage in dem Zusammenhang. Ich habe Probleme weitere Zeichen wie alle Arten von Klammern einzufügen. Also ()[]{} Könnt ihr mir da noch helfen?
                  Vermutlich ja.

                  Kommentar


                  • #10
                    Ok, und wie weiss ich, welches Zeichen escaped werden muss, weil von haus aus weiss ich das nicht.

                    Kommentar


                    • #11
                      Das ist leider etwas knifflig, das stimmt.

                      Vorab: Es ist meist egal, weil sich die Regex-Escape-Sequenzen fast nicht mit denen von PHP-Strings überschneiden, aber es ist dennoch in hohem Maße zu empfehlen, reguläre Ausdrücke nicht in double-quoted Strings zu setzen, sondern in single-quoted Strings. Letztere kennen nur die Escape-Sequenzen "\'" und "\\".

                      - http://php.net/manual/en/language.types.string.php

                      Mit single-quoted Strings musst du dir (abgesehen eben vom Backslash und dem Hochkomma) nur über Escape-Sequenzen der Regex-Syntax Gedanken machen.

                      Dort gilt: Grundsätzlich infrage für Escaping kommen alle Zeichen, die syntaktische Bedeutung haben. Das sind diese:

                      - http://php.net/manual/en/regexp.reference.meta.php

                      Beispiel: Wenn du willst, dass irgendwas einen Punkt (".") matcht, musst du grundsätzlich "\." schreiben, weil "." die syntaktische Bedeutung „(grob) beliebiges Zeichen“ hat.

                      Ich glaube, es ist generell nicht falsch, wenn du derartige Zeichen immer escapest, wenn du nicht ihre syntaktische Bedeutung willst, aber es gibt einige Ausnahmen, in denen du nicht escapen musst.

                      In einer Zeichenklasse '[xyz[.abc]' brauchst du etwa "[" und "." nicht zu escapen, weil aus dem syntaktischen Kontext „erkennbar“ ist, dass du dort das „wörtliche“ Zeichen meinst. '[xyz\[\.abc]' ist aber funktional identisch.

                      Ähnliche Fälle, in denen Escaping optional ist, wird es auch für (andere) Klammern, Quantifikatoren und dergleichen geben.

                      Am Rande:

                      Wenn du variable Werte (etwas einen Benutzernamen aus der Datenbank) in reguläre Ausdrücke einsetzt, solltest du immer preg_quote verwenden. (Die Regeln sind in allen Details aber eher was für Angeber. )

                      - http://php.net/manual/en/function.preg-quote.php

                      Diese Funktion escapet syntaktische relevante Zeichen der Eingabe.

                      Kommentar

                      Lädt...
                      X