*Markus: Probleme mit regulärem Ausdruck

Hallo,

Ich habe folgenden String:

  
$string = 'S;Die Marke;M;HGFR/5646;98674537887;Das ist ein Test';  

Ich möchte, dass im letzten Abschnitt "Das ist ein Test" ein Strichpunkt erlaubt ist, aber nur dann, wenn er "escaped" wird, also ;

So sollte es nicht funktionieren:

  
$string = 'S;Die Marke;M;HGFR/5646;98674537887;Das ist ;ein Test';  

Dieser Suchausdruck liefert aber auch TRUE, wenn der Strichpunkt als solcher in den Text geschrieben wird ohne, dass er escaped wird:

  
/^[A-Za-z];[\w\-\s]+;[MFUKmfuk];[\w\s\/]+;[\d]*?;[(?:\;)\w\s,\.\/äöüÄÖÜß]+$/  

Und zwar geht es um den Teil mit der Klammer: (?:;)
Ich habe schon versucht, (?:\;) zu schreiben, aber dennoch liefert der o.g. String TRUE. Ich sehe außer der Klammer keine Möglichkeit zu sagen, dass ein Strichpunkt nur dann in dem Text erlaubt ist, wenn ein Backslash vorangestellt wurde. Was mache ich falsch?

Markus

  1. Hi!

    /^[A-Za-z];[\w\-\s]+;[MFUKmfuk];[\w\s\/]+;[\d]*?;[(?:\;)\w\s,\.\/äöüÄÖÜß]+$/

    Wieso zeichnest du das obige hier im Forum mit lang=php aus? Es handelt sich doch - so wie das da steht - nur um einen Ansammlung von Zeichen, nicht um PHP-Code.

    Und zwar geht es um den Teil mit der Klammer: (?:;)
    Ich habe schon versucht, (?:\;) zu schreiben,

    In welchem Kontext versuchst du das zu notieren? Beachtest du, dass jeder beteiligte Kontext bestimmte Regeln zur Zeichennotation hat? Wenn du in einem regulären Ausdruck ein \ stehen haben willst, der für sich selbst steht, muss dort \ ankommen und darf nicht von anderen Kontexten (PHP-String beispielsweise) wegkonsumiert worden sein. Das PHP-Handbuch weist im Kapitel zum Backslash in regulären Ausdrücken auch darauf hin.

    Lo!

  2. Ich habe folgenden String:

    Hast du den selber erzeugt? Mein Beileid!

    $string = 'S;Die Marke;M;HGFR/5646;98674537887;Das ist ein Test';

    
    >   
    > Ich möchte, dass im letzten Abschnitt "Das ist ein Test" ein Strichpunkt erlaubt ist, aber nur dann, wenn er "escaped" wird, also \;  
    >   
    > So sollte es nicht funktionieren:  
    > ~~~php
      
    
    > $string = 'S;Die Marke;M;HGFR/5646;98674537887;Das ist ;ein Test';  
    > 
    
    

    Dieser Suchausdruck liefert aber auch TRUE, wenn der Strichpunkt als solcher in den Text geschrieben wird ohne, dass er escaped wird:

    /[1];[\w-\s]+;[MFUKmfuk];[\w\s/]+;[\d]*?;[(?:;)\w\s,./äöüÄÖÜß]+$/

      
    Bei diesem Ungetüm muss ich überhaupt mal begreifen, welcher Teil für deinen Test zuständig ist.  
    Dein "Test" darf bestehen aus  
    $x\_escaped = "\\;";  
    oder  
    $x\_char="[\\w\\s,.äöüÄÖÜß]";  
      
    /^[A-Za-z]  
      ;  
      [\w\-\s]+  
      ;  
      [MFUKmfuk]  
      ;  
      [\w\s\/]+  
      ;  
      [\d]\*?  
      ;  
      (?: $x\_char | $x\_escaped )+  
      $/x;  
      
    mfg Beat
    
    -- 
    
    ><o(((°>           ><o(((°>  
    
       <°)))o><                     ><o(((°>o  
    Der Valigator leibt diese Fische
    

    1. A-Za-z ↩︎

    1. Hallo,

      Hast du den selber erzeugt? Mein Beileid!

      Jup :)

      Dein "Test" darf bestehen aus
      $x_escaped = "\;";
      oder
      $x_char="[\w\s,.äöüÄÖÜß]";

      /[1]
        ;
        [\w-\s]+
        ;
        [MFUKmfuk]
        ;
        [\w\s/]+
        ;
        [\d]*?
        ;
        (?: $x_char | $x_escaped )+
        $/x;

      Es soll so sein, dass im letzten Teil, also im Text "Das ist ein Test" ein Strichpunkt vorkommen darf, und nur dann, wenn er escaped wird.
      Ich habe deinen Vorschlag ausprobiert, aber dennoch wird nicht FALSE zurückgeliefert, wenn ein Strichpunkt im Text vorkommt. Im Prinzip kann ich auf Anhieb auch nicht erkennen, warum die ODER-Verknüpfung hier helfen soll (im Gegensatz zu der Notation in der Zeichenklasse direkt):

        
      '/^[SZTszt];[\w\-\s]+;[MFUKmfuk];[\w\s\/]+;[\d]*?;[(\\;)\w\s,\.\/äöüÄÖÜß]*?$/'  
      
      

      Wie ich bereits erwähnte, liefert mein Ausdruck ebenso nicht das gewünschte Ergebnis.

      @dedlfix:

      \\ oder \\ habe ich ebenso auch schon ausprobiert. Keine Änderung.

      Markus


      1. A-Za-z ↩︎

      1. Dein "Test" darf bestehen aus
        $x_escaped = "\;";
        oder
        $x_char="[\w\s,.äöüÄÖÜß]";

        /[1]
          ;
          [\w-\s]+
          ;
          [MFUKmfuk]
          ;
          [\w\s/]+
          ;
          [\d]*?
          ;
          (?: $x_char | $x_escaped )+
          $/x;

        Korrektur

        $x_escaped = "\\;";

        '/[2];[\w-\s]+;[MFUKmfuk];[\w\s/]+;[\d]?;[(\;)\w\s,./äöüÄÖÜß]?$/'

        
        >   
        > Wie ich bereits erwähnte, liefert mein Ausdruck ebenso nicht das gewünschte Ergebnis.  
          
        Klar weil [\\;] eben kein escaptes Strich-Punkt meint. Da hilft dir () in [] auch nichts.  
          
        mfg Beat
        
        -- 
        
        ><o(((°>           ><o(((°>  
        
           <°)))o><                     ><o(((°>o  
        Der Valigator leibt diese Fische
        

        1. A-Za-z ↩︎

        2. SZTszt ↩︎

        1. Hallo,

          $x_escaped = "\\;";

          '/[1];[\w-\s]+;[MFUKmfuk];[\w\s/]+;[\d]?;[(\;)\w\s,./äöüÄÖÜß]?$/'

          
          > >   
          > > Wie ich bereits erwähnte, liefert mein Ausdruck ebenso nicht das gewünschte Ergebnis.  
            
          Gut, so funktioniert deine Methode. Ich verstehe aber nicht wieso. Was ist der Unterschied zwischen der Oder-Notation oder (?:\\\\;) in der Zeichenklasse direkt?  
            
          Markus
          

          1. SZTszt ↩︎

          1. Gut, so funktioniert deine Methode. Ich verstehe aber nicht wieso. Was ist der Unterschied zwischen der Oder-Notation oder (?:\\;) in der Zeichenklasse direkt?

            [(ab)]
            matcht ein "(", ")", "a" oder ein "b"
            aber nichts sagt, dass nur ab in dieser Reihenfolge gematcht wird.

            mfg Beat

            --
            ><o(((°>           ><o(((°>
               <°)))o><                     ><o(((°>o
            Der Valigator leibt diese Fische
            1. Hi,

              [(ab)]
              matcht ein "(", ")", "a" oder ein "b"
              aber nichts sagt, dass nur ab in dieser Reihenfolge gematcht wird.

              Ich dachte, dass gerade die Klammer einzelne Zeichen in dieser Reihenfolge zusammenfassen kann. Außerdem würde doch die Klammer in der Zeichenklasse matchen, wen ich sie escape, also (.

              Aber womöglich liege ich falsch in der Annahme.

              Markus

              1. Hi!

                Aber womöglich liege ich falsch in der Annahme.

                Das PHP-Handbuch hat eine sehr ausführliche Beschreibung zu all den Einzelheiten der Perl-Regulären Ausdrücke. Damit kann man recht schnell seine Annahmen prüfen.

                Hmm, früher war das Kapitel Pattern Syntax eine große Seite und man konnte bequem auf der seite suchen und hoch und runter blättern. Jetzt hat man den einzelnen Abschnitten je eine Seite spendiert und man sucht sich zu Tode, wenn man beispielsweise nach (?: suchen will, denn die allgemeine PHP-Seiten-Suchfunktion bietet nicht an, nur in der Pattern Syntax zu suchen.

                Wie auch immer: Zeichenklassen arbeiten mit einer Menge Besonderheiten. Lies speziell den letzten Satz im verlinkten Abschnitt

                Lo!