Christophe: Regulärer Ausdruck

Hallo zusammen

Habe eine Frage zu einem Regulären ausdruck. Nichts verrücktes aber ich komme nicht drauf. Ich will lediglich das nur Zeichenketten mit diesem Format akzeptiert werden. "string1\string2:" was ich bis jetzt gemacht habe

  
if (preg_match('/^[A-Z].[\].[a-zA-Z:]/', trim($read))){  
[...]  
}  

Habe schon etliche Versionen aber es passt nicht wirklich. Ich hoffe es kann mir wer helfen.

Danke

  1. Hallo,

    Ich will lediglich das nur Zeichenketten mit diesem Format akzeptiert werden. "string1\string2:"

    dein RegEx meint aber etwas ganz anderes. Nämlich:

    ^                Stringanfang
       [A-Z]            EIN Großbuchstabe
       .                EIN beliebiges Zeichen
       [].[a-zA-Z:]    EIN Zeichen, das entweder Buchstabe, eckige Klammer,
                        Punkt oder Doppelpunkt ist

    Habe schon etliche Versionen aber es passt nicht wirklich. Ich hoffe es kann mir wer helfen.

    Aus welchen Zeichen dürfen denn string1 und string2 bestehen? Nur Buchstaben? Ich nehme mal an, Großbuchstaben, Kleinbuchstaben und Ziffern. Also haben wir folgenden Ausdruck:

    ^                Stringanfang
       [0-9A-Za-z]      Ziffer, Großbuchstabe oder Kleinbuchstabe, und das
       +                beliebig oft, aber mindestens 1mal
       \               Ein Backslash
       [0-9A-Za-z]      Ziffer, Großbuchstabe oder Kleinbuchstabe, und das
       +                beliebig oft, aber mindestens 1mal
       :                Ein Doppelpunkt

    Ganz wichtig:
    1. Der Punkt steht für EIN beliebiges Zeichen.
    2. Zeichen + und * stehen als Quantifizierer. Ein * hinter einem Zeichen oder einer Zeichenklasse bedeutet: beliebig oft, darf aber auch fehlen; ein + bedeutet: beliebig oft, aber mindestens 1mal.
    3. Wenn Sonderzeichen als normale Zeichen des Ausdrucks gemeint sind, muss ihnen ein Backslash als Escape-Zeichen vorangestellt werden.
    4. Daraus folgt, dass der Backslash selbst auch eine Sonderbedeutung hat und ebenfalls escapet werden muss, wenn er wörtlich gemeint ist.

    Durch die fehlerhafte Verwendung des Backslash hast du z.B. die schließende eckige Klammer "unwirksam gemacht". Was du mit dem Punkt vorhattest, kann ich mir allerdings nicht erklären.

    So long,
     Martin

    --
    Computer lösen für uns Probleme, die wir ohne sie gar nicht hätten.
    1. Erst mal danke für dein ausführliche Antwort. Habe das nun nach deinem Rezept eingebaut aber ich komme trotztdem nicht in die if Bedingung. Habe jetzt geschrieben:

        
      $read = "TEST\gaga:";  
      if (preg_match('/^[A-Z]+\\[a-z]+:/', trim($read))){  
        echo $read;  
      }  
      
      

      Dies sollte doch eigentlich funktionieren? Was mache ich den noch immer falsch?

      1. Hallo Christophe,

        $read = "TEST\gaga:";

        if (preg_match('/[1]+\[a-z]+:/', trim($read))){
          echo $read;
        }

        
        >   
        > Dies sollte doch eigentlich funktionieren? Was mache ich den noch immer falsch?  
          
        Der Fehler liegt in deinem Test-String:  
          
          $read = "TEST\gaga:";  
          
        Der String enthält offensichtlich keinen Backslash, sondern die Escape-Sequenz \g, die aber nicht speziell definiert ist. Ich weiß nicht, wie PHP solche undefinierten Escapes auflöst, aber lass dir den String mal direkt ausgeben - ich vermute, er lautet "TESTgaga" oder "TESTaga".  
          
        Beachte den Unterschied zwischen 'einzelnen' und "doppelten" Anführungszeichen! Wenn du den String in '' setzt, wird das Ergebnis das sein, was du erwartest, denn dann werden keine Escape-Sequenzen aufgelöst. Andernfalls musst du den Backslash auch hier mit einem Backslash escapen, also doppelt notieren, um \*einen\* Backslash im String zu haben.  
          
        Ciao,  
         Martin  
        
        -- 
        Zwei Dinge sind unendlich: Das Universum und die menschliche Dummheit. Beim Universum bin ich mir aber nicht ganz sicher.  
          (Albert Einstein, deutscher Physiker)  
        
        

        1. A-Z ↩︎

        1. Hi,

          Wenn du den String in '' setzt, wird das Ergebnis das sein, was du erwartest, denn dann werden keine Escape-Sequenzen aufgelöst.

          <klugscheiss> Doch, und zwar ' und \ </klugscheiss>

          MfG ChrisB

          --
          Light travels faster than sound - that's why most people appear bright until you hear them speak.
          1. Hallo Chris,

            Wenn du den String in '' setzt, wird das Ergebnis das sein, was du erwartest, denn dann werden keine Escape-Sequenzen aufgelöst.
            <klugscheiss> Doch, und zwar ' und \ </klugscheiss>

            das wusste ich in der Tat noch nicht, danke für den Hinweis!
            Nein, nicht <klugscheiss>, sondern wertvolle Info.

            Schönes Wochenende,
             Martin

            --
            Der Klügere gibt solange nach, bis er der Dumme ist.
      2. Hello,

        Erst mal danke für dein ausführliche Antwort. Habe das nun nach deinem Rezept eingebaut aber ich komme trotztdem nicht in die if Bedingung. Habe jetzt geschrieben:

        $read = "TEST\gaga:";
        if (preg_match('/[1]+\[a-z]+:/', trim($read))){
          echo $read;
        }

        
        >   
        > Dies sollte doch eigentlich funktionieren? Was mache ich den noch immer falsch?  
          
        Hast Du für $read wirklich 'TEST\gaga:' in Doublequotes benutzt, oder steht da vielleicht etwas anderes in Deinem Testscript?  
          
        Der Backslash hat auch bei PHP eine besondere Bedeutung:  
        <http://www.php.net/manual/de/language.types.string.php#language.types.string.syntax.double>  
          
        Wenn Du Deinen Teststring also mittels Doublequotes begrenzt im Script, dann musst Du den Backslash sinnvollerweise auch escapeen. Mit "\g" wird aber PHP nichts anfangen können. Schau Dir aber trotzdem mal an, was dabei herauskommt.  
          
          
          
        Liebe Grüße aus dem schönen Oberharz  
          
          
        Tom vom Berg  
        ![](http://selfhtml.bitworks.de/Virencheck.gif)  
          
        
        -- 
        Nur selber lernen macht schlau  
        <http://bergpost.annerschbarrich.de>  
          
        
        

        1. A-Z ↩︎