php.de

Zurück   php.de > Webentwicklung > PHP Einsteiger > PHP Tipps 2006

 
 
LinkBack Themen-Optionen Thema bewerten
Alt 07.12.2006, 19:03  
Benutzer
 
Registriert seit: 23.08.2006
Beiträge: 86
Canni
Standard 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
Canni ist offline  
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 07.12.2006, 19:08  
Erfahrener Benutzer
 
Registriert seit: 21.05.2008
Beiträge: 9.937
Zergling-new wird schon bald berühmt werden
Standard

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)
}
?>
Zergling-new ist offline  
Alt 07.12.2006, 19:29  
Erfahrener Benutzer
 
Benutzerbild von dsmcg
 
Registriert seit: 11.10.2005
Beiträge: 2.405
dsmcg sorgt für eine eindrucksvolle Atmosphäredsmcg sorgt für eine eindrucksvolle Atmosphäredsmcg sorgt für eine eindrucksvolle Atmosphäre
Standard

de.comp.lang.php.* FAQ - 8.10. Wie überprüfe ich einen String auf seinen Inhalt?
__________________
Wie man Fragen richtig stellt
dsmcg ist offline  
Alt 07.12.2006, 19:50  
Erfahrener Benutzer
 
Registriert seit: 16.07.2005
Beiträge: 1.007
PHP-Kenntnisse:
Fortgeschritten
brian johnson befindet sich auf einem aufstrebenden Ast
Standard

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....
brian johnson ist offline  
Alt 07.12.2006, 20:03  
Erfahrener Benutzer
 
Registriert seit: 21.05.2008
Beiträge: 9.937
Zergling-new wird schon bald berühmt werden
Standard

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.
Zergling-new ist offline  
Alt 07.12.2006, 20:40  
Erfahrener Benutzer
 
Registriert seit: 16.07.2005
Beiträge: 1.007
PHP-Kenntnisse:
Fortgeschritten
brian johnson befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
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:
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';

Zitat:
$string1 besteht nicht ausschließlich aus Buchstaben.
$string2 besteht nicht ausschließlich aus Buchstaben.
Zitat:
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:
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:
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ß
brian johnson ist offline  
Alt 07.12.2006, 21:08  
CIX88
Gast
 
Beiträge: n/a
Standard

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.
 
Alt 07.12.2006, 21:24  
Erfahrener Benutzer
 
Registriert seit: 21.05.2008
Beiträge: 9.937
Zergling-new wird schon bald berühmt werden
Standard

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.

Zitat:
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.
Zergling-new ist offline  
Alt 07.12.2006, 21:50  
Erfahrener Benutzer
 
Registriert seit: 21.05.2008
Beiträge: 9.937
Zergling-new wird schon bald berühmt werden
Standard

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.
Zergling-new ist offline  
Alt 07.12.2006, 22:44  
Erfahrener Benutzer
 
Registriert seit: 08.11.2004
Beiträge: 2.079
Der_Gerhard ist zur Zeit noch ein unbeschriebenes Blatt
Der_Gerhard eine Nachricht über ICQ schicken
Standard

Zitat:
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';
__________________
**********************************
Nein, ich bin nicht die Signatur.
Ich putze hier nur.
**********************************
Der_Gerhard ist offline  
 


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Nach erstem Buchstaben aktion max-dhom PHP Tipps 2008 4 28.05.2008 22:03
Buchstaben mit fixen Pixelbreiten in Arrays verpackt rezix PHP Tipps 2008 11 06.03.2008 16:12
Ersetzen einzelner Buchstaben Unbekanntes_Pferd PHP Tipps 2008 26 02.02.2008 16:18
Nur mit den ersten 3 Buchstaben einer Variable arbeiten DDogg PHP Tipps 2006 4 16.06.2006 14:20
einen buchstaben großschreiben lassen? comiceman PHP Tipps 2006 8 12.06.2006 19:14
Buchstaben verschlüsseln PHP Tipps 2006 5 24.05.2006 11:53
Zeilenbruch bei 40 buchstaben mokus PHP Tipps 2006 3 22.04.2006 00:43
Liste nach Buchstaben und Sonderzeichen (!) sortiert odaa PHP-Fortgeschrittene 8 11.10.2005 16:26
Buchstaben ausgeben PHP Tipps 2005-2 2 02.09.2005 02:12
Buchstaben bei Datenaexport aus DB falsch uebertragen Datenbanken 2 25.08.2005 14:51
eregi zahlen, gross und kleine buchstaben, keine umlaute,... Dave Waterstone PHP Tipps 2005-2 3 24.07.2005 19:11
[Erledigt] Buchstaben in ASCII umwandeln und umgekehrt PHP Tipps 2005 2 07.05.2005 14:36
Kyrillische Buchstaben verbiten test022 PHP Tipps 2005 8 20.01.2005 10:45
Liste nach Buchstaben geordnet PHP-Fortgeschrittene 2 07.10.2004 09:52
[Erledigt] Erster Buchstaben von ganzem Wort PHP Tipps 2004 5 28.06.2004 10:10

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
php auf buchstaben prüfen, php prüfen ob buchstabe, php buchstaben prüfen, ctype_alpha umlaute, php prüfen ob buchstaben, string auf buchstaben prüfen, php prüfen auf buchstaben, php prüfen ob nur buchstaben, php prüfen ob string zeichen enthält, php überprüfen ob buchstabe, auf buchstaben prüfen php, php auf buchstaben überprüfen, php prüfen buchstaben, php ctype_alpha umlaute, http://www.php.de/php-tipps-2006/43008-pruefen-auf-buchstaben.html, prüfen auf buchstaben php, php ersten buchstaben prüfen, php string jedes einzelne zeichen überprüfen, prüfen ob string zeichen enthält php, prüfen ob buchstaben php

Alle Zeitangaben in WEZ +2. Es ist jetzt 13:03 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum

Creative Commons License
Dieser Inhalt ist unter einer Creative Commons-Lizenz lizenziert.