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