Problem mit Regex

Hallo zusammen,
ich möchte mittels eines regulären Ausdrucks überprüfen, ob ein Passwort mindestens drei Zeichen lang ist. Leider funktioniert meine Version nicht, da jeder String zugelassen wird - auch wenn er nur zwei Zeichen lang ist.

So sieht sie aus:

if(!preg_match('~S{3,}~', $var)) foo(); Was mache ich falsch?

Vielen Dank für eure Hilfe
lg, freakXHTML

[php]if (sizeof($pw) > 2)[/php]

‚~S{3,}~‘ matcht jeden String, in dem irgendwo drei oder mehr angrenzende Vorkommen des Buchstabens ‚S‘ auftreten. Du wolltest vermutlich ‚~^\S{3,}$~‘ wie in: drei oder mehr Nicht-Whitespace-Zeichen als einzige zulässige Zeichen zwischen Beginn und Ende des Strings. Falls du in UTF-8 arbeitest, wäre der Unicode-Modifikator noch sinnvoll: ‚~^\S{3,}$~u‘, um zu verhindern, dass ein Multibyte-Character als 2 oder mehr Zeichen angesehen wird.

Es wird davon abgeraten, preg_-Funktionen zu benutzen um Dinge zu machen, die es schon als richtige Funktionen gibt.

strlen();
oder
mb_strlen();

sind da am besten geeignet.

@Thor: sizeof gibt die Anzahl Einträge in einem Array zurück und nicht die Länge einer Zeichenkette.

Stimmt, strlen sollte es sein.

Wir tun hier aber keine Dinge, die es schon als richtige Funktionen gibt. :wink:

Doch.
strlen() sagt die Länge des Strings und >3 sagt ob eine Zahl größer ist als drei. Und genau das wird erzielt.

Der Unterschied liegt bei der Behandlung von Whitespaces im String. Der reguläre Ausdruck filtert die mit raus.

[php]<?php

$test = ‚a b‘;

var_dump((bool) preg_match(‚~^\S{3,}$~u‘, $test)); // bool(false)
var_dump(mb_strlen($test) >= 3); // bool(true)[/php]

Vielen Dank für eure tolle Hilfe! thumbsup

Bis bald
lg, freakXHTML

Leerzeichen sind auch Zeichen. Von daher hat er genau strlen bzw. mb_strlen gesucht.

Auch wahr. Ich habe das „S“ im mitgelieferten regulären Ausdruck als Versuch gelesen, die Charakterklasse \S (die Negation von \s) zu wählen. Das halte ich auch immer noch für relativ logisch. Die Frage ist, ob Whitespace „innerhalb“ von Passwörtern (also nicht vorne oder hinten, die wird man mit trim() rauslöschen) zugelassen sein soll oder nicht. Falls nein, braucht es einen regulären Ausdruck.

Na ja, wie auch immer, alle Alternativen wurden ja nun genannt.