Bug #45488 [Com]: preg_replace failed when the $subject parameter length exceeds 100009

From: Date: Fri, 25 Jun 2010 12:02:16 +0000
Subject: Bug #45488 [Com]: preg_replace failed when the $subject parameter length exceeds 100009
References: 1  Groups: php.bugs 
Request: Send a blank email to php-bugs+get-151864@lists.php.net to get a copy of this message
Edit report at http://bugs.php.net/bug.php?id=45488&edit=1

 ID:               45488
 Comment by:       daniel dot reiche at tu-dresden dot de
 Reported by:      webez dot cn at gmail dot com
 Summary:          preg_replace failed when the $subject parameter length
                   exceeds 100009
 Status:           Bogus
 Type:             Bug
 Package:          PCRE related
 Operating System: *
 PHP Version:      5.2.6

 New Comment:

if this is intended, shouldn't the manual reflect that and e.g. state
that the subject length is limited by PCRE_BACKTRACK_LIMIT ?

Just happened to stumble over this myself, and only the Bug-Report
Dialog showed this bug to me after i tried to write a new one.
Was not able to find it myself using the search!


Previous Comments:
------------------------------------------------------------------------
[2008-07-12 16:06:33] felipe@php.net

This is expected, it when fails preg_last_error() returns: int(2)
That means PREG_BACKTRACK_LIMIT_ERROR.

See
http://docs.php.net/manual/en/pcre.configuration.php#ini.pcre.backtrack-limit

------------------------------------------------------------------------
[2008-07-11 17:57:39] webez dot cn at gmail dot com

Description:
------------
if the $subject parameter's length exceeds 100009, str_replace has no
return value.

This has been reproduced on windows 2003 with php 5.2.6 and Linux with
php 5.2.5

PS:
If there is backslash in the $subject parameter and $pattern parameter,
the critical poiont will change, the maximum string length to reproduce
this bug will increase.

Reproduce code:
---------------
<?
$dummyText=str_pad("[start]",100016-strlen("[start][end]"),"*")."[end]";
str_replace_test($dummyText);
$dummyText=str_pad("[start]",100017-strlen("[start][end]"),"*")."[end]";
str_replace_test($dummyText);
function str_replace_test($dummyText){
	$result=preg_replace("/\[start\](.+?)\[end\]/eis","passed",$dummyText);
	$result==""?$result="failed":true;
	echo "str_replace with length: ".strlen($dummyText)."
".$result."<br>";
}
?>

Expected result:
----------------
str_replace with length: 100009 passed
str_replace with length: 100010 passed

Actual result:
--------------
str_replace with length: 100009 passed
str_replace with length: 100010 failed


------------------------------------------------------------------------



-- 
Edit this bug report at http://bugs.php.net/bug.php?id=45488&edit=1


Thread (3 messages)

« previous php.bugs (#151864) next »