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