Hi Simcha, I tried your suggestion and it does prevent the SID from being inserted inside the extension, but causes double ?'s and SID's in some cases. Thanks, Cameron On 8/18/08 2:25 AM, "Simcha Younger" <simcha.younger@xxxxxxxxx> wrote: > > Hi > > > You did not put a question mark in your character class ([\/\w\.-] and > instead you put it together with the session id. > The expression looks for a sequence without which is not followed by the > next expression --- ?PHPSESSID\=2u0cca..... > If it would count the last `p` of `.php` then the next expression would > violate the negative lookahead. > Instead it stops just before it, after the `.ph` which is the longest > expression it could find that fulfills your negative lookahead, and then it > inserts the new sessionid over there. > > Try instead > $buffer = > preg_replace('/"http\:\/\/www\.domain\.com([\/\w\.\-]*\??)(?!PHPSESSID\=2u0c > caffoh6jaeapkke35qpp87;?)/', > '"http://www.domain.com$1?PHPSESSID=t9gksvpdcuobsnqt98qloe6lg4;', $buffer); > > (not tested) > > > > Simcha Younger > > -----Original Message----- > From: Cameron B. Prince [mailto:cplists@xxxxxxxxxxxxxxxxxx] > Sent: Monday, August 18, 2008 12:56 AM > To: php-general@xxxxxxxxxxxxx > Subject: Negative Look Ahead Regex - Code Mistake or Bug? > > Hello, > > I¹ve run into a problem with a regex and need help determining if this is my > mistake or a bug. The regex is for inserting a SID into every link in the > buffer before it¹s flushed, but only when each link doesn¹t already have a > SID. > > An example of the code is here: > > $buffer = > preg_replace('/"http\:\/\/www\.domain\.com([\/\w\.-]*)(?!\?PHPSESSID\=2u0cca > ffoh6jaeapkke35qpp87;?)/', > '"http://www.domain.com$1?PHPSESSID=t9gksvpdcuobsnqt98qloe6lg4;', $buffer); > > The code works correctly in most cases except when a SID already exists and > there is a path after the .com such as: > > http://www.domain.com/path1/path2.php?PHPSESSID=2u0ccaffoh6jaeapkke35qpp87; > > When this URL is processed by the regex, it becomes: > > http://www.domain.com/path1/path2.ph?PHPSESSID=t9gksvpdcuobsnqt98qloe6lg4;p? > PHPSESSID=2u0ccaffoh6jaeapkke35qpp87; > > > So the problem is the regex not only falsely matches, it's inserting the SID > in between 2nd and 3rd letters of the extension. > > You can see the code in action here: > > http://kottmann.com/test.php > > The full source for the test code is also available when viewing the source > of this page. > > I've tested this on PHP v5.1.6 and PHP v5.2.6. > > TIA, > Cameron > > > > > > > -- PHP General Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php