RE: [PHP] Seemingly weird regex problem

From: Date: Thu, 20 Jan 2005 21:19:21 +0000
Subject: RE: [PHP] Seemingly weird regex problem
References: 1  Groups: php.general 
Request: Send a blank email to php-general+get-206895@lists.php.net to get a copy of this message
On Thu, 2005-01-20 at 15:13, Michael Sims wrote: > Tim Boring wrote: > > On Thu, 2005-01-20 at 13:41, Jason Wong wrote: > >> I suspect what you want to be doing is something like this: > >> > >> switch (TRUE) { > >> case ANY_EXPRESSION_THAT_EVALUATES_TO_TRUE: > >> ... > >> } > > > > Thanks for the suggestion, but I'm not sure that does what I'm looking > > for. I really think the problem is with my regex, not necessarily > > with the way I've constructed my switch statement. > > No, Jason is right. Your problem IS in the switch statement. You cannot use it the > way you are trying to and get the results you're expecting. Each case expression is > evaluated with the switch expression just as if you compared them with the "==" > operator. In your case, you're comparing the return value of preg_match() against > the $line string. This isn't what you want. > > Here's what happens. Say your $line contains the string "AKRN". Your regex > pattern > matches only if the line begins with a non-word character. "A" is definitely a word > character, so the pattern does not match. preg_match returns an integer indicating > the number of matches, which in this case is 0. > > To evaluate your case, PHP does the equivalent of: > > if ("AKRN..." == 0) > > which is actually TRUE. From: > > > http://www.php.net/manual/en/language.types.string.php#language.types.string.conversâöÃ&0z6íý:` > ÎXˆ > ion > > "If the string starts with valid numeric data, this will be the value used. > Otherwise, the value will be 0 (zero)." > > Since "AKRN" doesn't begin with valid numeric data, it is converted to 0 for the > purposes of the comparison. Since 0 == 0 the case comparison evaluates to true. > > When you switch it to begin with a number, PHP now uses that number. Say you switch > it to "1AKRN". PHP then will compare 1 == 0 which is false. > > To accomplish what you want you'll have to change it to: > > switch (true) { > case ($total_counter <= 5): > ... > case (preg_match(...): > ... > > etc. as Jason suggested. Why don't you try it and see if it works? > > HTH I tried it and it worked as Jason explained. Sorry, I'm a little slow at times. Thanks for taking the time and effort to explain this in more detail! Tim

« previous php.general (#206895) next »