Der Martin: switch mit preg_match

Beitrag lesen

Hallo,

in einem switch habe ich als case zweimal preg_match verwendet.

ja, und du hast damit erstens ein Verständnisproblem, zweitens ein Problem mit der automatischen Typumwandlung.

$var2 = 'radio(firma_messegrund5)input';

switch($var2)
{

Hier willst du also abhängig vom Wert von $var2 eine Fallunterscheidung treffen.

case preg_match('/checkbox((.*))input/',$var2):

Die folgenden Anweisungen werden ausgeführt, wenn $var2==preg_match(...) ist. Nun ist $var2 ein String, preg_match liefert jedoch eine Zahl zurück. Zunächst wird also $var2 auch in einen Zahlenwert umgewandelt - und zwar, weil der Stringwert nicht sinnvoll als Zahl interpretierbar ist, in den Wert 0. Auf der anderen Seite des Vergleichsoperators hat preg_match() den gesuchten Ausdruck 1mal gefunden, im Endeffekt ermittelt das case-Statement also 0==1, und das ergibt false. Der Folgeblock wird also nicht ausgeführt.

case preg_match('/radio((.*))input/',$var2):

In diesem Fall liefert preg_match() eine 0, weil der Suchausdruck nicht gefunden wurde. Das case-Statement vergleicht also 0==0, und das ergibt true, also wird der nachfolgende Block ausgeführt.

benutze ich eine if-Abfrage, geht es. Kann es sein, dass switch reguläre Ausdrücke nicht wirklich mag?

Nein, das hat damit nichts zu tun. Es hat damit zu tun, dass dir die Arbeitsweise von switch/case nicht wirklich klar ist: Der Ausdruck in switch() wird nacheinander mit allen case-Ausdrücken vergleichen, bis eine Übereinstimmung gefunden wird.

mir wirds schon zu bunt, ich benutz dann doch lieber if(), trotzdem würd ich gern wissen, warum das so ist.

Nach deiner Denkweise bräuchtest du eine Funktion, die nicht eine ja/nein-Aussage liefert, sondern den gefundenen Ausdruck selbst. Dann könntest du mit deinem switch-Konstrukt weiterkommen.

So long,
 Martin

--
F: Was sagt die kleine Kerze zur großen Kerze?
A: Ich gehe heute nacht aus!
Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(