# Regex suche nach Buchstaben und Zahlen, aber nciht nach Sonderzeichen.



## FlaverSaver (3. Oktober 2010)

Hallo liebes Forum,

ich habe ein Problem mit Regex.
Bei meiner Registration für neue Benutzer sollen Sonderzeichen erst ab fünf Zahlen bzw. Buchstaben erlaubt sein.

Momentan zähle ich mit strlen die Länge des Benutzernamens, wenn der Benutzername fünf oder weniger : Zeichen hat setze ich folgenden Regex

```
$regex = '/^([A-Za-z0-9öäüÄÖÜßáàâéèêíìîóòôúùû]?(\s)?)+$/';
```

Wenn er mehr Zeichen hat setze ich:

```
$regex = '/^([A-Za-z0-9öäüÄÖÜßáàâéèêíìîóòôúùû:;()!?*._-]?(\s)?){4,}$/';
```

Nun ist das Problem, dass zum Beispiel der Benutzername ************ (sechs Rufzeichen) gültig ist, obwohl er keine Zahlen bzw. Buchstaben enthält. Das liegt ja daran das beim zweiten Regex auch meine Sonderzeichen gültige Zeichen sind und mit gezählt werden.

Ich habe folgenden Regex probiert, um dafür zu sorgen, dass mindestens fünf Zahlen bzw. Buchstaben verwendet werden müssen. Nur leider funktioniert er nicht.

```
$regex = '/^([A-Za-z0-9öäüÄÖÜßáàâéèêíìîóòôúùû:;()!?*._-]?(\s)?)([A-Za-z0-9öäüÄÖÜßáàâéèêíìîóòôúùû]{4,})$/';
```

Was muss ich also ändern, damit mindestens fünf Buchstaben vorhanden sein müssen, damit Sonderzeichen als gültig anerkannt werden?

mfg
Philip


----------



## chmee (3. Oktober 2010)

Mach doch ein Regex, dass Dir die Anzahl der Einzelfunde hergibt, also 

(1) egal, wieviele Zeichen, erstmal Funde für Zeichen [a-zA-z0-9]{1} zählen.
(2) Wenn weniger als 6, dann muß Len mit Count übereinstimmen
(3) Wenn länger als 5, dann muß Len-Count mindestens 5 sein.

mfg chmee


----------



## FlaverSaver (3. Oktober 2010)

Hallo,

sehr gute Idee. Warum immer so umständlich? 

Nur wie zähle ich nun mit preg_match die Treffer? Oder könnte ich einfach

```
preg_match('muster', 'string', $treffer);
echo count($treffer);
```
machen?

//Habs gerade probiert, count($treffer); gibt immer 0 zurück.

mfg
Philip


----------



## chmee (3. Oktober 2010)

preg_match gibt doch nur einen Fund zurück. Du nimmst preg_match_all
und solltest mit *echo count($treffer[0]);* die Anzahl bekommen.

mfg chmee


----------



## FlaverSaver (3. Oktober 2010)

Hallo,

so dann gebe ich meinen Postings auch mal eine Persönlichkeit. 

So ich glaube ich stelle mich gerade verdammt doof an.

Ich habe folgendes:

```
$regex = '/^([A-Za-z0-9öäüÄÖÜßáàâéèêíìîóòôúùû ]?(\s)?)+$/';
$eingabe = 'lol was soll das eig 123';

preg_match_all($regex, $eingabe, $treffer );

echo 'Count:'.count($treffer[0]).'<br/>Eingabe:'.$eingabe;

echo '<pre>';
var_dump($treffer);
```

Ich bekomme aber immer nur einen Treffer zurück...

Ich weiß nicht ob da irgendwo ein grober Schnitzer ist oder ob ich einfach gerade voll auf dem Schlauch stehe...

Philip


----------



## chmee (3. Oktober 2010)

Du nimmst als Quantor ein ? (entspricht {0,1}), wogegen ich auf genau ein Zeichen beschränke {1} UND Deine Regex bezieht sich immer noch auf eine längere Sequenz (allein durch Anfang ^ und Ende $), anstatt auf einzelne Zeichen..


```
$string="DasIstEin#TEST";
$regex="#[A-Za-z0-9öäüÄÖÜßáàâéèêíìîóòôúùû]{1}#";

preg_match_all($regex,$string,$found);

echo "<pre>";
var_dump($found);
echo "</pre>";

echo count($found[0])." von ".strlen($string)." sind Nichtsonderzeichen!";
```
Sorry, Fehler können drin sein, habs grad so hingeschmiert..

mfg chmee

p.s.: Schau mal in meiner Signatur, das ist der Regex-Online-Tester, sehr feines Spielzeug zum Testen und Verstehen.

p.p.s.: Willkommen 
p.p.p.s.:  Es heißt strlen(), nicht len();


----------



## FlaverSaver (3. Oktober 2010)

Hey,

Super, danke das klappt wunderbar, und es ist bis jetzt Fehlerfrei!

Ok, den Regex Tester probiere ich dann mal aus.

Danke fürs "Willkommen" 

Wo habe ich oder auch du len() verwendet? 

mfg
Philip


----------



## chmee (3. Oktober 2010)

Ich hatte anfangs in meinem Source len() benutzt und nach nem Kurztest bemerkt, dass das echo nicht ausgeworfen wird, kurzer Blick.. Ah ja, strlen() anstatt len()..

mfg chmee


----------

