[PHP] not sure why regex is doing this
Hi, I have a text file that I have to parse and insert into a db. these are a couple of sample lines (they are part of the variable $query) (4536,'golf tournament management',430,0,0), (1434,'Premium golf balls',,,0), I have to replace the blank entries (,,) with NULLs, and I am using this regex: $query = preg_replace('/,\s*,/',',NULL,', $query, -1); after this line, only ONE of the ,, sets is replaced by ,NULL, like this: (4536,'golf tournament management',430,0,0), (1434,'Premium golf balls',NULL,,0), So, my problem is that I have to run the regex twice to replace both sets of ,, with ,NULL, and I really don't want to do that. Why isn't it getting them both with the first regex, and how should I modify it to catch them both? TIA, Craig -- PHP General Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php
Re: [PHP] not sure why regex is doing this
On Fri, 9 Jan 2004, craig wrote: (4536,'golf tournament management',430,0,0), (1434,'Premium golf balls',,,0), I have to replace the blank entries (,,) with NULLs, using this regex: $query = preg_replace('/,\s*,/',',NULL,', $query, -1); after this line, only ONE of the ,, sets is replaced by ,NULL, like: (1434,'Premium golf balls',NULL,,0) The regex does continue trying to make matches, but the point at which it continues is just past your replacement. In other words, the trailing comma in ,NULL, is not considered part of the string to match/replace. This should do the trick: preg_replace('/,\s*(?=[,\)])/', ',NULL', $input); (?=pattern) is a positive lookahead. It evaluates true if the next characters match the pattern, but those characters are not consumed. So that regex is equivalent to match a pattern starting with a comma followed by any existing spaces, ONLY IF the next character is , or ) The most robust way you could write this regex is: preg_replace('/([,\(])\s*(?=[,\)])/', '\1NULL', $input); I know you'll probably never have input like (), but it would work as expected. Many tricky regex problems can be solved by lookaheads. There is also a negative lookahead (?!pattern) ... also note that this is an advanced regex feature and won't it work on many regex engines not based on PCRE. -- Kelly Hallman // Ultrafancy -- PHP General Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php
RE: [PHP] not sure why regex is doing this
Thanks Kelly. That works just like I wanted, only starting the regex engine once. Guess I'll have to figure out lookahead. -Craig -Original Message- From: Kelly Hallman [mailto:[EMAIL PROTECTED] Sent: January 9, 2004 11:24 AM To: craig Cc: Php Subject: Re: [PHP] not sure why regex is doing this On Fri, 9 Jan 2004, craig wrote: (4536,'golf tournament management',430,0,0), (1434,'Premium golf balls',,,0), I have to replace the blank entries (,,) with NULLs, using this regex: $query = preg_replace('/,\s*,/',',NULL,', $query, -1); after this line, only ONE of the ,, sets is replaced by ,NULL, like: (1434,'Premium golf balls',NULL,,0) The regex does continue trying to make matches, but the point at which it continues is just past your replacement. In other words, the trailing comma in ,NULL, is not considered part of the string to match/replace. This should do the trick: preg_replace('/,\s*(?=[,\)])/', ',NULL', $input); (?=pattern) is a positive lookahead. It evaluates true if the next characters match the pattern, but those characters are not consumed. So that regex is equivalent to match a pattern starting with a comma followed by any existing spaces, ONLY IF the next character is , or ) The most robust way you could write this regex is: preg_replace('/([,\(])\s*(?=[,\)])/', '\1NULL', $input); I know you'll probably never have input like (), but it would work as expected. Many tricky regex problems can be solved by lookaheads. There is also a negative lookahead (?!pattern) ... also note that this is an advanced regex feature and won't it work on many regex engines not based on PCRE. -- Kelly Hallman // Ultrafancy -- PHP General Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php -- PHP General Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php