Ankündigung

Einklappen
Keine Ankündigung bisher.

prüfen auf buchstaben

Einklappen

Neue Werbung 2019

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

  • prüfen auf buchstaben

    Hi mal wieder.
    Ich habe ein Formular bei dem in einem Feld nur Zahlen eingegeben werden dürfen und das andere darf nur Buchstaben enthalten. Bevor das in der DB landet möchte ich das natürlich prüfen. Für die Zahlen habe ich is_numeric() benutzt ( gibt ne EM wenn == false ), aber Buchstaben und Zahlen zusammen sind ja immer ein String ( überigens ohne Leerzeichen ). Also mit is_numeric() == true oder false geht das nicht.
    Kann mir jemand einen Tip geben wie ich prüfen kann, ob mein String NUR Buchstaben enthält? Hab leider bis dato noch keine Früchte meiner Suche davongetragen.
    Thx schon mal
    Canni

  • #2
    Hallo,
    entweder mit den ctype-Funktionen oder mit Regulären Ausdrücken:

    PHP-Code:
    <?php
    if (preg_match('#^[0-9]+$#'$sInput)) {
      
    // enthält nur Zahlen, mindestens eine
    }
    if (
    preg_match('#^[a-z]{5}$#i'$sInput)) {
      
    // enthält genau 5 Buchstaben (a-z, Umlaute weiß ich grad nicht)
    }
    ?>

    Kommentar


    • #3
      de.comp.lang.php.* FAQ - 8.10. Wie überprüfe ich einen String auf seinen Inhalt?

      Kommentar


      • #4
        buff. preg_match hier nur bei seehr großen strings nehmen, erst dann rechnet sich das.

        eine kurze, aber simple funktion regelt das bei kleineren sachen schneller und resourcen sparender:

        PHP-Code:
        function is_letter($str)
        {
            
        $str=strtolower($str); $a=strlen($str); $letters=range('a','z');
            if(
        $a==1) return in_array($str,$letters);
            else {
        $i=0; while(in_array($str{$i},$letters) && $i<$a$i++;}
            return (
        $i==$a)?TRUE:FALSE;

        die erklärung dazu:

        http://www.ifyouwantblood.de/de/php/...is-letter.html

        alles in meiner kleinen mpelib()

        EDIT: sorry, war die alte version....

        Kommentar


        • #5
          preg_match() bei großen Strings? Warum?
          Man sollte preg_match() eher benutzen, wenn das Problem anders zu lösen zu komplex wird.
          Deine Lösung finde ich übrigens schlecht.
          Nehmen wir an, ich habe einen 1000 Zeichen langen Text, der mit einer Zahl beginnt, also schon von Anfang an klar ist, dass der Text nicht nur aus Buchstaben besteht.
          Dann durchläufst du trotzdem weiter jedes einzelne Zeichen. Ein "break" wäre hier angebracht.
          Abgesehen davon sind array-Funktionen auch nicht gerade sehr performant, zumindest sind sie einfach auch nicht nötig, um herauszufinden, ob ein String nur aus Buchstaben besteht.

          Wenn du die Extension ctype installiert hast, benutz ctype_alpha().
          Die Funktion ist in C++ geschrieben und zusätzlich sicher Performance-optimiert.

          Ansonsten bau dir besser was mit strlen(), for (), ord() und break zusammen.

          Kommentar


          • #6
            Zitat von Zergling
            preg_match() bei großen Strings? Warum?
            Man sollte preg_match() eher benutzen, wenn das Problem anders zu lösen zu komplex wird.
            wie gesagt, nur bei großen strings (>=~600 zeichen). laut meinen und anderen tests unter php 4.2 und php 5.
            hier hört es sich allerdings nach nem kleinen string an.

            Zitat von Zergling
            Deine Lösung finde ich übrigens schlecht.
            Nehmen wir an, ich habe einen 1000 Zeichen langen Text, der mit einer Zahl beginnt, also schon von Anfang an klar ist, dass der Text nicht nur aus Buchstaben besteht.
            Dann durchläufst du trotzdem weiter jedes einzelne Zeichen. Ein "break" wäre hier angebracht.
            nö, denn es ist eine WHILE schleife. wenn in (in_array($str{$i},$letters) && $i<$a) === FALSE wird die schleife abgebrochen auch ohne break.

            probiers aus:

            PHP-Code:
            function is_letter($str

                
            $str=strtolower($str); $a=strlen($str); $letters=range('a','z'); 
                if(
            $a==1) return in_array($str,$letters); 
                else {
            $i=0; while(in_array($str{$i},$letters) && $i<$a$i++;} 
                return (
            $i==$a)?TRUE:FALSE

            $string1 '1Buchstabensuppe';
            $string2 '02340/2345 - Mr. Nathan';
            if(
            is_letter($string1)) echo '$string1 besteht ausschließlich aus Buchstaben.';
            else echo 
            '$string1 besteht nicht ausschließlich aus Buchstaben.';
            if(
            is_letter($string2)) echo '$string2 besteht ausschließlich aus Buchstaben.';
            else echo 
            '$string2 besteht nicht ausschließlich aus Buchstaben.'
            mein ergebnis mit 0,0128793 sekunden verbesserung zu "$string1='Buchstabensuppe';

            $string1 besteht nicht ausschließlich aus Buchstaben.
            $string2 besteht nicht ausschließlich aus Buchstaben.
            Zitat von Zergling
            Abgesehen davon sind array-Funktionen auch nicht gerade sehr performant, zumindest sind sie einfach auch nicht nötig, um herauszufinden, ob ein String nur aus Buchstaben besteht.
            deine lösung? ohne preg_match und ctype ext?

            Zitat von Zergling
            Wenn du die Extension ctype installiert hast, benutz ctype_alpha().
            Die Funktion ist in C++ geschrieben und zusätzlich sicher Performance-optimiert.
            davon wurde nichts erwähnt, ist allerdings die beste möglichkeit.

            Zitat von Zergling
            Ansonsten bau dir besser was mit strlen(), for (), ord() und break zusammen..
            strlen, die mutter von for() [while()] sind vorhanden. ord() kennt mehr als buchstaben, ist also nicht unbedingt schneller.

            gruß

            Kommentar


            • #7
              Hmmm, mal ein ganz anderer Gedanke:

              $string1 = '5345345';
              $string2 = 'gfgdfgd';

              echo $string1 / 1, '
              ';
              echo $string2 / 1, '
              ';

              Bei Zahlen müsste immer >= 1 rauskommen, bei Buchstaben 0.

              Kommentar


              • #8
                Ah das mit dem while () hatte ich nicht genau genug angeschaut, weil die Funktion so übel formatiert war. Macht fast den Eindruck, als wolltest du die Performance noch dadurch pushen, dass du in der Funktion möglichst sparsam mit Whitespaces umgehst

                Aber brauchen hier keine Milisekunden-Performance-Schlacht für so eine Pipi-Funktion durchzuführen, da ich so oder so auf ctype_alpha() bzw. preg_match('#^[a-z]+$#i') zurückgreifen würde.
                Na vielleicht mess ich trotzdem mal.

                Hmmm, mal ein ganz anderer Gedanke:
                PHP-Code:
                <?php
                $string1 
                '5345345';
                $string2 'gfgdfgd';
                $string3 '23sdng';
                $string4 'iusfn432jsf';
                $string5 'oszbf86';

                echo 
                $string1 1'
                '
                ;
                echo 
                $string2 1'
                '
                // 0
                echo $string3 1'
                '

                echo 
                $string4 1'
                '
                // 0
                echo $string5 1'
                '
                // 0
                ?>
                Ist also nicht zweckmäßig.

                Kommentar


                • #9
                  Zusatz, grade hab ich doch mal einen Benchmark gemacht. Deine Funktion ist übelst langsam:

                  PHP-Code:
                  <?php
                  // -------------------------------------------------------------------------------------------------

                  $sTest = array();
                  $sTest[] = 'abcdefghijklmnopqrstuvwxyz1';
                  $sTest[] = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ1';
                  $sTest[] = md5(time());
                  $sTest[] = '0';
                  $sTest[] = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1'// entfernt man die 1, wirft deine Funktion einen Notice

                  $aBenchmark = array();

                  // -------------------------------------------------------------------------------------------------

                  // brian
                  function isLetter_1($str)
                  {
                      
                  $str=strtolower($str); $a=strlen($str); $letters=range('a','z');
                      if(
                  $a==1) return in_array($str,$letters);
                      else {
                  $i=0; while(in_array($str{$i},$letters) && $i<$a$i++;}
                      return (
                  $i==$a)?TRUE:FALSE
                  }


                  // -------------------------------------------------------------------------------------------------

                  function isLetter_2($sString)
                  {
                      return 
                  ctype_alpha($sString);
                  }

                  // -------------------------------------------------------------------------------------------------

                  function isLetter_3($sString)
                  {
                      return 
                  preg_match('#^[a-z]+$#i'$sString);
                  }

                  // -------------------------------------------------------------------------------------------------

                  // Zergling
                  function isLetter_4($sString)
                  {
                      
                  $x strlen($sString);
                      if (
                  $x == 0) {
                          return 
                  false;
                      }
                      for (
                  $i 0$i $x$i++) {
                          
                  $iChar ord($sString{$i});
                          
                  // 65 = A, 90 = Z, 97 = a, 122 = z
                          
                  if ($iChar 65 || $iChar 122 || ($iChar >= 91 && $iChar <= 96)) {
                              return 
                  false;
                          }
                      }
                      return 
                  true;
                  }

                  // -------------------------------------------------------------------------------------------------

                  list ($iStartSec$iStartMSec) = explode(' 'microtime());

                  for (
                  $i 0$i 10000$i++) {
                      
                  $bTmp0 isLetter_1($sTest[0]);
                      
                  $bTmp1 isLetter_1($sTest[1]);
                      
                  $bTmp2 isLetter_1($sTest[2]);
                      
                  $bTmp3 isLetter_1($sTest[3]);
                      
                  $bTmp4 isLetter_1($sTest[4]);
                  }

                  list (
                  $iEndSec$iEndMSec) = explode(' 'microtime());

                  $aBenchmark['isLetter_1'] = ($iEndSec $iStartSec) + ($iEndMSec $iStartMSec);

                  // -------------------------------------------------------------------------------------------------

                  list ($iStartSec$iStartMSec) = explode(' 'microtime());

                  for (
                  $i 0$i 10000$i++) {
                      
                  $bTmp0 isLetter_2($sTest[0]);
                      
                  $bTmp1 isLetter_2($sTest[1]);
                      
                  $bTmp2 isLetter_2($sTest[2]);
                      
                  $bTmp3 isLetter_2($sTest[3]);
                      
                  $bTmp4 isLetter_2($sTest[4]);
                  }

                  list (
                  $iEndSec$iEndMSec) = explode(' 'microtime());

                  $aBenchmark['isLetter_2'] = ($iEndSec $iStartSec) + ($iEndMSec $iStartMSec);

                  // -------------------------------------------------------------------------------------------------

                  list ($iStartSec$iStartMSec) = explode(' 'microtime());

                  for (
                  $i 0$i 10000$i++) {
                      
                  $bTmp0 isLetter_3($sTest[0]);
                      
                  $bTmp1 isLetter_3($sTest[1]);
                      
                  $bTmp2 isLetter_3($sTest[2]);
                      
                  $bTmp3 isLetter_3($sTest[3]);
                      
                  $bTmp4 isLetter_3($sTest[4]);
                  }

                  list (
                  $iEndSec$iEndMSec) = explode(' 'microtime());

                  $aBenchmark['isLetter_3'] = ($iEndSec $iStartSec) + ($iEndMSec $iStartMSec);

                  // -------------------------------------------------------------------------------------------------

                  list ($iStartSec$iStartMSec) = explode(' 'microtime());

                  for (
                  $i 0$i 10000$i++) {
                      
                  $bTmp0 isLetter_4($sTest[0]);
                      
                  $bTmp1 isLetter_4($sTest[1]);
                      
                  $bTmp2 isLetter_4($sTest[2]);
                      
                  $bTmp3 isLetter_4($sTest[3]);
                      
                  $bTmp4 isLetter_4($sTest[4]);
                  }

                  list (
                  $iEndSec$iEndMSec) = explode(' 'microtime());

                  $aBenchmark['isLetter_4'] = ($iEndSec $iStartSec) + ($iEndMSec $iStartMSec);

                  // -------------------------------------------------------------------------------------------------

                  asort($aBenchmark);
                  reset($aBenchmark);

                  foreach (
                  $aBenchmark as $sFunction => $dTime) {
                      echo 
                  $sFunction': '$dTime"\n"'
                  '
                  ;
                  }
                  ?>
                  Code:
                  isLetter_2: 0.123885 // ctype_alpha
                  isLetter_3: 0.323478 // preg_match
                  isLetter_4: 2.812809 // Zergling's Funktion
                  isLetter_1: 10.840773 // brian's Funktion
                  Ich hoffe ich hab keinen Fehler eingebaut, aber hab viel mit copy&paste gearbeitet, sollte stimmen.

                  PS: Ich hab den Benchmark übrigens nach meiner Funktion geschrieben, hab also nix nachoptimiert.
                  PPS: Die Funktionen unterscheiden sich leider funktional, in Unit-Tests kämen also unterschiedliche Treffer, gerade für Extremfälle wie Leerstring, 1-Zeichen-String, etc.

                  Kommentar


                  • #10
                    Zitat von CIX88
                    Hmmm, mal ein ganz anderer Gedanke:

                    $string1 = '5345345';
                    $string2 = 'gfgdfgd';

                    echo $string1 / 1, '
                    ';
                    echo $string2 / 1, '
                    ';

                    Bei Zahlen müsste immer >= 1 rauskommen, bei Buchstaben 0.


                    Vergiss das mal ganz schnell
                    // Zahl, aber nicht >= 1
                    $string3 = '0.1234';
                    $string4 = '-123';

                    // Zahl, aber 0
                    $string5 = '0';

                    Kommentar


                    • #11
                      geht das nich auch irgendwie so?:
                      PHP-Code:

                      if(is_numeric($var)){ 
                      ...

                      Habs mal getestet.

                      Code:
                      "str" -> false
                      "1str" -> false
                      "str1" -> false
                      "0" -> true
                      "0.1"-> true
                      weiß nicht ob das vielleicht was ist, was man gebrauchen kann.

                      Kommentar


                      • #12
                        prüfen auf buchstaben

                        Kommentar


                        • #13
                          sorry... hab nur die zhlüberprüfung gesehen. naja.. egal

                          Kommentar


                          • #14
                            Danke für die Antworten
                            preg_match hat funktioniert, nur, daß mein String nur genau 3 Zeichen haben darf. Das {3} haute nicht hin, daraus wurde immer mindestens 3.
                            Ich habe es jetzt so gemacht:

                            PHP-Code:
                            if(preg_match('#[a-zA-Z]{3}#'$arr_presave['3lc']) AND strlen($arr_presave['3lc']) == 3){... 
                            Gruß

                            Kommentar


                            • #15
                              Jetzt prüfst du einen boolschen Ausdruck darauf, ob er aus mindestens 3 Buchstaben besteht. Wenn du Pech hast, wird das 2. Argument in einen String gewandelt und in TRUE bzw. FALSE umgewandelt und die Bedingung ist dann immer wahr.

                              preg_match('#^[a-z]{3}$#i', $sString)

                              sollte funktionieren.

                              Kommentar

                              Lädt...
                              X