ID: 23903 Comment by: stuge-phpbugs at cdy dot org Reported By: mnilsson at bowesnet dot com Status: Bogus Bug Type: PCRE related Operating System: linux 2.4.18 PHP Version: 4.3.2 New Comment:
Compare #23946, which is a dupe. $ echo xyz|perl -e 'while(<STDIN>) { $_=~ s/(.*)/http:\/\/\1/;print}' http://xyz Unfortunately, this shows Andrei's comment to be incorrect. I believe the error in both preg_replace() and ereg_replace() is that the regex gets checked one extra time after the entire string has been processed already, all regexes that match an empty string will hence replace one extra time at the end. I believe an empty string should only be allowed to match at the very first iteration at the core of [ep]reg_replace(). See #23946 for some more discussion, examples and a suggested (and untested :) patch for ereg_replace(). Previous Comments: ------------------------------------------------------------------------ [2003-06-06 08:10:55] [EMAIL PROTECTED] "That's just how it works. It matches the whole string on the first try and then tries again after the 'c'. Perl works the same way. A better way would be to use (.+) actually." --Andrei So not any bug.. ------------------------------------------------------------------------ [2003-06-06 03:05:05] [EMAIL PROTECTED] Andrei, is this documentation issue or real bug? :) ------------------------------------------------------------------------ [2003-05-30 15:12:29] [EMAIL PROTECTED] Smaller example: echo preg_replace ("/(.*)/", "http://\$1", "abc"),"\n"; Output: http://abchttp:// This doesn't look correct to me. However, your search pattern doesn't look very reasonable - the normal way to prepend a string to another string is the "." operator: $bannerad_url = 'http://' . $_POST['bannerad_url']; ------------------------------------------------------------------------ [2003-05-30 13:08:35] mnilsson at bowesnet dot com PROBLEM: preg_replace does not return the proper value with a * in the regular expression. INPUT: $_POST['bannerad_url'] = 'www.canoe.ca'; PROCESS CODE: $_POST['bannerad_url'] = trim($_POST['bannerad_url']); if (preg_match ("/^http:\/\/(.*)/i", $_POST['bannerad_url']) > 0) $bannerad_url = $_POST['bannerad_url']; else $bannerad_url = preg_replace ("/(.*)/", "http://\$1", $_POST['bannerad_url']); OUTPUT: echo $bannerad_url; -------> http:// www.canoe.cahttp:// FIX: INPUT: $_POST['bannerad_url'] = 'www.canoe.ca'; PROCESS CODE: $_POST['bannerad_url'] = trim($_POST['bannerad_url']); if (preg_match ("/^http:\/\/(.+)/i", $_POST['bannerad_url']) > 0) $bannerad_url = $_POST['bannerad_url']; else $bannerad_url = preg_replace ("/(.+)/", "http://\$1", $_POST['bannerad_url']); OUTPUT: echo $bannerad_url; -------> http://www.canoe.ca NOTES: I was able to reproduce this several times. It seems to be related to the *, but replacing it with a + solves the problem. Thanks. ------------------------------------------------------------------------ -- Edit this bug report at http://bugs.php.net/?id=23903&edit=1