RE: [PHP] Negative Look Ahead Regex - Code Mistake or Bug?

From: Date: Mon, 18 Aug 2008 07:25:24 +0000
Subject: RE: [PHP] Negative Look Ahead Regex - Code Mistake or Bug?
References: 1  Groups: php.general 
Request: Send a blank email to php-general+get-278261@lists.php.net to get a copy of this message
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@princeservices.com] Sent: Monday, August 18, 2008 12:56 AM To: php-general@lists.php.net Subject: [PHP] 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 No virus found in this incoming message. Checked by AVG - http://www.avg.com Version: 8.0.138 / Virus Database: 270.6.4/1617 - Release Date: 17/08/2008 12:58

« previous php.general (#278261) next »