Bend: Regulärer Ausdruck

Hi,

eine Variable darf nur aus 2 Ziffern bestehen.

Nicht weniger Ziffern, nicht mehr Ziffern und keine anderen Zeichen.

Ist das dann so korrekt?

if (!preg_match( "/\d{2}/", $Variable) ) {
echo("Fehler!");
}

Gruß, Bernd

  1. @@Bend:

    nuqneH

    Nicht weniger Ziffern, nicht mehr Ziffern und keine anderen Zeichen.

    Ist das dann so korrekt?

    if (!preg_match( "/\d{2}/", $Variable) ) {
    echo("Fehler!");
    }

    Nein, denn auch "12345" und "foo42bar" matchen, da der Ausdruck prüft, ob irgendwo im String zwei Ziffern hintereinander vorkommen. Wenn du außer diesen beiden Ziffern keine anderen Zeichen haben willst musst die Begrenzer ^ und $ verwenden.

    BTW, echo ist keine Funktion; du kannst auch echo "Fehler!"; schreiben.

    Qapla'

    --
    Gut sein ist edel. Andere lehren, gut zu sein, ist noch edler. Und einfacher.
    (Mark Twain)
    1. musst die Begrenzer ^ und $ verwenden.

      BTW, echo ist keine Funktion; du kannst auch echo "Fehler!"; schreiben.

      Hi Gunnar,

      danke für die beiden Tips.

      Grüße, Bernd

    2. servus Gunnar,

      BTW, echo ist keine Funktion; du kannst auch echo "Fehler!"; schreiben.

      das erinnert mich an ein Grauen, dass ich mal überarbeiten musste..

      *schauder*

      Man kann auch mehrere Zeilen mit einem echo ausgeben!
      Nie >300 Zeilen mit jeweils einem echo und mehreren \t zum Einrücken für die Browser-Quelltext-Anzeige benutzen..!

      der wurzelbert

      --
      Ist es ein Vogel?
      Ist es ein Flugzeug?
      Nein, es ist Reis, Baby!
    3. BTW, echo ist keine Funktion; du kannst auch echo "Fehler!"; schreiben.

      Als Ergänzung:

      Ob Klammern zu verwenden sind oder nicht notwendigerweise etwas damit zu tun, dass es keine Funktion ist - viele Sprachkonstrukte verhalten sich wie Funktionen und wenn sie das tun sollen, braucht man Klammern[1]. Sprich sie sind austauschbar - bis auf die Tatsache dass sich Sprachkonstrukte nicht als Callback verwenden lassen und keine Variablenfunktionen unterstützen, da sie weiter "unten" im Interpreter arbeiten und "vorher" geparst werden.

      Dieser Nachteil wird aber dadurch wieder Wett gemacht, dass sie dadurch eben wesentlich schneller sind als funktionen.

      Aber zurück zu echo:

      echo ist ein Sprachkonstrukte welches sehr sehr "bodennah" operiert und sich deshalb nicht wie eine Funktion verhält.

      Oft gibts auch den Irrglauben, echo und print wären in jedem fall austauschbar oder das eine wäre gar ein Alias des anderen, das stimmt aber nicht - während sich print wie eine Funktion verhalten kann, kann echo das nicht.

      Beispiel:

      <?php  
        echo print('foo') . 'bar';  
        // Ausgabe: foobar1  
        // Rückgabewert von print ist (warum auch immer) in jedem Fall 1  
      ?>  
        
      <?php  
        echo echo('foo') . 'bar';  
        // Fehler: unexpected T_ECHO, weil sich echo eben nicht wie eine Funktion verhält und als solche auch keinen Rückgabewert besitzt.  
      ?>  
        
      <?php  
      $a = print('foo');  
      echo "\n\$a is $a";  
        // funktioniert  
      ?>  
        
      <?php  
      $a = echo('foo');  
      echo "\n\$a is $a";  
        // führt wieder zu einer Fehlermeldung  
      ?>
      

      Welchen Praktischen nutzen man aus einem Rückgabewert von print() erhält, erschließt sich mir aber nicht ganz - hier wäre ich über eine Erklärung dankbar.

      [1] ich bitte davon abzusehen, dass auch die Typenumwandlung als Sprachkonstrukt zählt :)

      1. Hi!

        Ob Klammern zu verwenden sind oder nicht notwendigerweise etwas damit zu tun, dass es keine Funktion ist - viele Sprachkonstrukte verhalten sich wie Funktionen und wenn sie das tun sollen, braucht man Klammern[1].

        Runde Klammern kommen auch noch in anderen Situationen vor, nicht nur als Parametereinfassung von Funktionen. Und dass runde Klammern aus Sprachkonstrukten Funktionen erzeugen wäre mir auch neu[*]. Mir fällt da lediglich print ein, das wie eine Funktion verwendet werden kann (aber nicht muss).

        [*] Vielleicht versteh ich aucn nur nicht, was du sagen willst.

        Welchen Praktischen nutzen man aus einem Rückgabewert von print() erhält, erschließt sich mir aber nicht ganz - hier wäre ich über eine Erklärung dankbar.

        Mir geht es ähnlich beim Lesen deines Postings.

        Lo!

        1. Mir fällt da lediglich print ein, das wie eine Funktion verwendet werden kann (aber nicht muss).

          include() oder require() lassen sich mit und ohne Klammern verwenden ;)

          Um was es mir allgemein ging: jegliche Sprachkonstrukte tun so (mit den genannten Ausnahmen) als wären sie Funktionen. In der PHP-Doku von print() ist aber folgendes zu lesen:

          "print() is not actually a real function (it is a language construct) so you are not required to use parentheses with its argument list."

          Daraus könnte man ableiten, dass Sprachkonstrukte prinzipiell ohne Klammern aufgerufen werden könnten, das stimmt aber nicht und könnte zu problemen führen.

          Darum auch meine Antwort auf Gunnars Aussage:

          BTW, echo ist keine Funktion; du kannst auch echo "Fehler!"; schreiben.

          Daraus könnte man ebenfalls - ohne genauere Recherche - ableiten, dass man bei "Dingen die keine Funktion sind" keine Klammern braucht oder man sie ohne konsequenzen Hinzufügen kann.

          Mein Beispiel sollte zeigen, dass das aber im Fall von print() sehrwohl einen Unterschied macht. Wenn plötzlich irgendwo eine 1 dasteht und niemand weiß warum, könnte sowas die Ursache sein. Es soll ja Spaßvögel gebe, die aufgrund von irgendwelchen absonderlichen CGL sämtliche Vorkommen von echo durch print ersetzen oder umgekehrt.

          eval(), unset(), isset() oder empty() sind ebenfalls Sprachkonstrukte und müssen wie Funktionen verwandt werden - da läuft nix ohne Klammern.

          echo hat aber die Ausnahme, dass es sich als einziges (?) Sprachkonstrukt mit Klammern nicht wie eine Funktion verhält und keinen Rückgabewert liefert. Das führt dann zu einer Fehlermeldung. Nebest dessen kann man echo mit mehreren Argumenten aufrufen ohne Klammern zu verwenden und es tut dennoch, als wäre es eine Funktion.

          Wenn also jemand - aus welchem grund auch immer ein "echo print('foo');" durch ein "echo echo('foo');" ersetzt (siehe oben) wird's eine Fehlermeldung geben.

          1. Hi!

            Mir fällt da lediglich print ein, das wie eine Funktion verwendet werden kann (aber nicht muss).
            include() oder require() lassen sich mit und ohne Klammern verwenden ;)

            Die Klammern haben da den selben Effekt wie bei $x = (1 + 1); oder $foo = ("bar"); Sie sind im Grunde genommen sinnlos, bilden jedoch aus programmtechnischer Sicht einen separat zu berechnenden Ausdruck.

            Um was es mir allgemein ging: jegliche Sprachkonstrukte tun so (mit den genannten Ausnahmen) als wären sie Funktionen.

            Diese Aussage ist für "jegliche Sprachkonstrukte" nicht richtig. Welche Ausnahmen hast du denn bisher genannt?

            include und require nebst den _once-Varianten, die ein Ergebnis zurückliefern können, verhalten sich nicht wie man es von einer Funktion erwarten würde. (Siehe Beispiel 4 der include-Doku). Sie können nicht mit Klammern verwendet werden, aber ihr Argument kann geklammert werden - das ist der Unterschied zu Funktionen und zu Sprachkonstrukten, die wie Funktionen verwendet werden können oder müssen.

            Daraus könnte man ableiten, dass Sprachkonstrukte prinzipiell ohne Klammern aufgerufen werden könnten, das stimmt aber nicht und könnte zu problemen führen.

            Man könnte auch aus 1+1=2 ableiten, dass 2+2 ebenfalls 2 ergibt. Oder anders: Man kann immer falsche Schlüsse ziehen.

            Darum auch meine Antwort auf Gunnars Aussage:

            BTW, echo ist keine Funktion; du kannst auch echo "Fehler!"; schreiben.
            Daraus könnte man ebenfalls - ohne genauere Recherche - ableiten, dass man bei "Dingen die keine Funktion sind" keine Klammern braucht oder man sie ohne konsequenzen Hinzufügen kann.

            Was du so alles aus nicht vorhandenen Aussagen ableiten kannst.

            Mein Beispiel sollte zeigen, dass das aber im Fall von print() sehrwohl einen Unterschied macht. Wenn plötzlich irgendwo eine 1 dasteht und niemand weiß warum, könnte sowas die Ursache sein. Es soll ja Spaßvögel gebe, die aufgrund von irgendwelchen absonderlichen CGL sämtliche Vorkommen von echo durch print ersetzen oder umgekehrt.

            Wer solche einfachen Fehler macht und sie nicht einmal nach Lektüre der Handbuchseiten findet, sollte sich <del>ein anderes Hobby suchen</del><ins>im Recherchieren üben</ins>.

            eval(), unset(), isset() oder empty() sind ebenfalls Sprachkonstrukte und müssen wie Funktionen verwandt werden - da läuft nix ohne Klammern.

            Die sind mir zu meiner vorigen Antwort nicht eingefallen, sei's drum. Diese sind jedenfalls wie Funktionen zu verwenden, und die Klammern gehören zum Funktionsaufruf.

            echo hat aber die Ausnahme, dass es sich als einziges (?) Sprachkonstrukt mit Klammern nicht wie eine Funktion verhält und keinen Rückgabewert liefert. Das führt dann zu einer Fehlermeldung. Nebest dessen kann man echo mit mehreren Argumenten aufrufen ohne Klammern zu verwenden und es tut dennoch, als wäre es eine Funktion.

            Nein, echo ist keine Funktion, tut auch nicht so und kann deshalb nicht wie eine verwendet werden. Wenn da Klammern verwendet werden, dann fassen diese Ausdrücke zusammen, so wie bei (1+1)*2.

            Warum auch immer im PHP-Handbuch echo und die includes wie Funktionen dargestellt werden ... bei echo ist sogar die Syntaxzeile falsch (auch wenn das im folgenden Absatz nochmal verbal korrigiert wird):

            void echo ( string $arg1 [, string $... ] )

            echo (1,2,3) liefert einen schönen Syntaxfehler.

            Wenn also jemand - aus welchem grund auch immer ein "echo print('foo');" durch ein "echo echo('foo');" ersetzt (siehe oben) wird's eine Fehlermeldung geben.

            Es gibt noch mehr <del>sinnlose</del><ins>undurchdachte</ins> Aktionen, die zu Fehlermeldungen führen. Zu Sprachkonstrukten lässt sich lediglich aussagen, dass sie ihre (dokumentierten) Eigenheiten haben, die manchmal aber nicht immer in anderen Elementen von PHP wiedergefunden werden können.

            Lo!

            1. Hallo,

              eval(), unset(), isset() oder empty() sind ebenfalls Sprachkonstrukte und müssen wie Funktionen verwandt werden - da läuft nix ohne Klammern.
              Die sind mir zu meiner vorigen Antwort nicht eingefallen, sei's drum. Diese sind jedenfalls wie Funktionen zu verwenden, und die Klammern gehören zum Funktionsaufruf.

              da stellt sich die Frage: Was unterscheidet sie dann von Funktionen? Sie bekommen eine in Klammern stehende Parameterliste, die ein oder mehrere Elemente enthält, und sie tun etwas mit diesen Argumenten und ermitteln daraus ein eindeutig bestimmtes Ergebnis (okay, unset() ist mit Ergebnistyp void definiert). Das qualifiziert sie für mich als Funktion.

              echo (1,2,3) liefert einen schönen Syntaxfehler.

              Ich stelle verblüfft fest: Stimmt!
              Dabei hätte ich Stein und Bein geschworen, dass PHP den Komma-Operator wie C kennt: Alle Ausdrücke in der Liste der Reihe nach auswerten, und den letzten als Wert des Gesamtausdrucks zurückgeben.

              Ciao,
               Martin

              --
              Ich wollt', ich wär ein Teppich.
              Dann könnte ich morgens liegenbleiben.
              Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
              1. Hi!

                eval(), unset(), isset() oder empty() sind ebenfalls Sprachkonstrukte und müssen wie Funktionen verwandt werden - da läuft nix ohne Klammern.
                Diese sind jedenfalls wie Funktionen zu verwenden, und die Klammern gehören zum Funktionsaufruf.
                da stellt sich die Frage: Was unterscheidet sie dann von Funktionen? Sie bekommen eine in Klammern stehende Parameterliste, die ein oder mehrere Elemente enthält, und sie tun etwas mit diesen Argumenten und ermitteln daraus ein eindeutig bestimmtes Ergebnis (okay, unset() ist mit Ergebnistyp void definiert). Das qualifiziert sie für mich als Funktion.

                Ja, aus der Sicht sehen sie aus und verhalten sich wie Funktionen. Allerdings haben echte PHP-Funktionen noch mehr Verwendungsmöglichkeiten, wie die Verwendbarkeit als Callback, aufrufbar mit einigen der Function Handling Functions und als Variable Functions. (Das hatte suit übrigens schon erwähnt.)

                echo (1,2,3) liefert einen schönen Syntaxfehler.
                Ich stelle verblüfft fest: Stimmt!
                Dabei hätte ich Stein und Bein geschworen, dass PHP den Komma-Operator wie C kennt: Alle Ausdrücke in der Liste der Reihe nach auswerten, und den letzten als Wert des Gesamtausdrucks zurückgeben.

                Das Komma ist zwar in der Operatoren-Rangfolge enthalten, allerdings steht dort nur "many uses" als Information. Als Parametertrenner im Funktionskopf dürfte es nach meinem Dafürhalten nicht als Operator zählen (so wie ; auch nicht als Operator zählt). Die einzige andere Anwendung, die mir einfällt wäre bei for, um mehrere Ausdrücke je expr{1..3} ausführen zu können. Da müsste das Komma als Operator zählen, obwohl es sich für mich nicht so anfühlt, sondern eher wie ein Syntaxbestandteil à la ;

                Lo!

                1. Moin,

                  eval(), unset(), isset() oder empty() ...
                  da stellt sich die Frage: Was unterscheidet sie dann von Funktionen? Sie bekommen eine in Klammern stehende Parameterliste, die ein oder mehrere Elemente enthält, und sie tun etwas mit diesen Argumenten und ermitteln daraus ein eindeutig bestimmtes Ergebnis (okay, unset() ist mit Ergebnistyp void definiert). Das qualifiziert sie für mich als Funktion.
                  Ja, aus der Sicht sehen sie aus und verhalten sich wie Funktionen. Allerdings haben echte PHP-Funktionen noch mehr Verwendungsmöglichkeiten, wie die Verwendbarkeit als Callback, aufrufbar mit einigen der Function Handling Functions und als Variable Functions. (Das hatte suit übrigens schon erwähnt.)

                  ah, stimmt. Daran hatte ich nicht gedacht.

                  echo (1,2,3) liefert einen schönen Syntaxfehler.
                  Ich stelle verblüfft fest: Stimmt!
                  Dabei hätte ich Stein und Bein geschworen, dass PHP den Komma-Operator wie C kennt: Alle Ausdrücke in der Liste der Reihe nach auswerten, und den letzten als Wert des Gesamtausdrucks zurückgeben.
                  Das Komma ist zwar in der Operatoren-Rangfolge enthalten, allerdings steht dort nur "many uses" als Information.

                  Hehe, das sagt alles und nichts. ;-)

                  Als Parametertrenner im Funktionskopf dürfte es nach meinem Dafürhalten nicht als Operator zählen (so wie ; auch nicht als Operator zählt).

                  Diese Mehrdeutigkeit ist mir auch in C schon aufgefallen: Dort ist das Komma als Operator definiert, dessen Operation darin besteht, den linken Operanden auszuwerten und dann wegzuwerfen, und den rechten als Ergebnis zu liefern. Aber woher "weiß" der Parser, dass der Komma-Operator in Listen -wie etwa in der Parameterliste eines Funktionsaufrufs oder bei Initialisierungswerten für Array oder enums- nicht angewendet werden darf? Innerhalb eines geklammerten Teilausdrucks in so einer Liste dagegen schon? Er hat also schon etwas Geheimnisvolles.

                  Die einzige andere Anwendung, die mir einfällt wäre bei for, um mehrere Ausdrücke je expr{1..3} ausführen zu können.

                  Genau da -in Kontrollstrukturen wie z.B. for, seltener auch while- setze ich ihn auch gern ein.

                  Da müsste das Komma als Operator zählen, obwohl es sich für mich nicht so anfühlt, sondern eher wie ein Syntaxbestandteil à la ;

                  Ja, mir widerstrebt es auch, das Komma als Operator zu sehen ...

                  Ciao,
                   Martin

                  --
                  Wer mit dem Finger droht, sollte ihn am Abzug haben, und nicht in der Nase.
                  Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
                  1. Hi!

                    Aber woher "weiß" der Parser, dass der Komma-Operator in Listen -wie etwa in der Parameterliste eines Funktionsaufrufs oder bei Initialisierungswerten für Array oder enums- nicht angewendet werden darf? Innerhalb eines geklammerten Teilausdrucks in so einer Liste dagegen schon? Er hat also schon etwas Geheimnisvolles.

                    Nicht wirklich. Viele Syntaxbestandteile können mehrfach vorkommen, bestes Beispiel sind die Buchstaben: Funktionsnamen, Variablennamen, Schlüsselwörter. Wenn der Parser ein bestimmtes Element erkannt hat, weiß er ja, was danach kommen kann und was nicht. Die Klammern nach einem Funktionsnamen begrenzen die Argumentliste. Innerhalb der Argumentliste gelten für die Klammern andere Regeln, weil sie nun Bestandteile von Ausdrücken sind. Und wenn in diesem Ausdruck ein Funktionsname vorkommt, ändert sich wieder die Bedeutung der Klammern. usw. usf.

                    Die einzige andere Anwendung, die mir einfällt wäre bei for, um mehrere Ausdrücke je expr{1..3} ausführen zu können.
                    Genau da -in Kontrollstrukturen wie z.B. for, seltener auch while- setze ich ihn auch gern ein.

                    Im while-Ausdruck mag PHP keine Kommas.

                    Lo!

                2. Hi!

                  eval(), unset(), isset() oder empty() sind ebenfalls Sprachkonstrukte und müssen wie Funktionen verwandt werden - da läuft nix ohne Klammern.
                  Diese sind jedenfalls wie Funktionen zu verwenden, und die Klammern gehören zum Funktionsaufruf.
                  da stellt sich die Frage: Was unterscheidet sie dann von Funktionen? Sie bekommen eine in Klammern stehende Parameterliste, die ein oder mehrere Elemente enthält, und sie tun etwas mit diesen Argumenten und ermitteln daraus ein eindeutig bestimmtes Ergebnis (okay, unset() ist mit Ergebnistyp void definiert). Das qualifiziert sie für mich als Funktion.

                  Ja, aus der Sicht sehen sie aus und verhalten sich wie Funktionen. Allerdings haben echte PHP-Funktionen noch mehr Verwendungsmöglichkeiten, wie die Verwendbarkeit als Callback, aufrufbar mit einigen der Function Handling Functions und als Variable Functions. (Das hatte suit übrigens schon erwähnt.)

                  Dazu fällt mir grad noch ein, warum unset(), isset() und empty() Sprachkonstrukte und keine Funktionen sind. Bei einer Funktion könnte man auch auch andere Ausdrücke als Argument übergeben, nicht nur Variablennamen. Und während bei einer Funktion (außer bei Objekten) der Wert des Ausdrucks per Kopie übergeben wird, was bei Variablen nur ihr Inhalt ist, wird für zumindest unset() der Variablenname benötigt, denn diese Variable soll ja vollständig verschwinden und nicht nur genullt werden oder ähnliches (wofür im Prinzip eine Referenz reichte).

                  Für isset() und empty() könnte es theoretisch reichen, nur eine Kopie des Wertes zu übergeben, denn isset() liefert auch bei vorhandenen Variablen mit dem Inhalt null ein false als Ergebnis, und empty() liefert für eine nicht vorhandene Variable das gleiche Ergebnis wie für die Inhalte null, 0, '', etc. Weil nicht vorhandene Variablen beim Auslesen null zurückliefern, könnten diese beiden den Variablenwert auch per Kopie übergeben bekommen. Allerdings, und das ist der Unterschied zu Funktionen, wird keine Notice-Meldung erzeugt.

                  Für Funktionen werden die als Parameter übergebenene Ausdrücke zuerst berechnet und anschließend die Funktion aufgerufen. Bei dieser Berechnung werden auch Zugriffe auf nicht vorhandene Variablen mit der Notice-Meldung bedacht. Die Sprachkonstrukte unset(), isset() oder empty() gehen also nicht den Weg der normalen Funktionsverarbeitung sondern arbeiten direkt mit den Variablennamen.

                  Lo!

      2. Welchen Praktischen nutzen man aus einem Rückgabewert von print() erhält, erschließt sich mir aber nicht ganz - hier wäre ich über eine Erklärung dankbar.

        Ich verwende öfters
        foreach( ... ){
           $somecondition and print $XY and last;
        }

        Klar, kann man auch anders...

        mfg Beat

        --
        ><o(((°>           ><o(((°>
           <°)))o><                     ><o(((°>o
        Der Valigator leibt diese Fische
        1. Ich verwende öfters
          foreach( ... ){
             $somecondition and print $XY and last;
          }

          Ich kann dir hier nicht ganz folgen.