]> granicus.if.org Git - php/commitdiff
fix bug #37800: preg_replace() limit parameter odd behaviour
authorNuno Lopes <nlopess@php.net>
Thu, 15 Jun 2006 15:33:25 +0000 (15:33 +0000)
committerNuno Lopes <nlopess@php.net>
Thu, 15 Jun 2006 15:33:25 +0000 (15:33 +0000)
#this is a regression in PHP_5_2 and HEAD branches only

ext/pcre/php_pcre.c
ext/pcre/tests/bug37800.phpt [new file with mode: 0644]

index 58225eb09eef6ee007f987f3ed94a01316d46a90..e4dee71d4ca632abcf45c9de82c9a0cdf2f9edf5 100644 (file)
@@ -1091,7 +1091,7 @@ PHPAPI char *php_pcre_replace(char *regex,   int regex_len,
                        if (limit != -1)
                                limit--;
 
-               } else if (count == PCRE_ERROR_NOMATCH) {
+               } else if (count == PCRE_ERROR_NOMATCH || limit == 0) {
                        /* If we previously set PCRE_NOTEMPTY after a null match,
                           this is not necessarily the end. We need to advance
                           the start offset, and continue. Fudge the offset values
diff --git a/ext/pcre/tests/bug37800.phpt b/ext/pcre/tests/bug37800.phpt
new file mode 100644 (file)
index 0000000..e8a0036
--- /dev/null
@@ -0,0 +1,31 @@
+--TEST--
+Bug #37800 (preg_replace() limit parameter odd behaviour)
+--FILE--
+<?php
+$s_string = '1111111111';
+$s_search = '/1/';
+$s_replace = 'One ';
+$i_limit = 1;
+$i_count = 0;
+
+$s_output = preg_replace($s_search, $s_replace, $s_string, $i_limit,
+$i_count);
+echo "Output = " . var_export($s_output, True) . "\n";
+echo "Count  = $i_count\n";
+var_dump(preg_last_error() === PREG_NO_ERROR);
+
+$i_limit = strlen($s_string);
+$s_output = preg_replace($s_search, $s_replace, $s_string, $i_limit,
+$i_count);
+echo "Output = " . var_export($s_output, True) . "\n";
+echo "Count  = $i_count\n";
+var_dump(preg_last_error() === PREG_NO_ERROR);
+
+?>
+--EXPECT--
+Output = 'One 111111111'
+Count  = 1
+bool(true)
+Output = 'One One One One One One One One One One '
+Count  = 10
+bool(true)