[PHP] not sure why regex is doing this

2004-01-09 Thread craig
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

2004-01-09 Thread Kelly Hallman
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

2004-01-09 Thread craig
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