Php 试图理解preg#u replace';s在大字符串上的行为

Php 试图理解preg#u replace';s在大字符串上的行为,php,regex,pcre,Php,Regex,Pcre,使用stru repeat('a',1024)时,$temp的长度为1024,而使用stru repeat('a',1024*1024)时,$temp的长度为0 我正在运行PHP7.4.3 可能是什么问题?您实际上遇到了一个错误 $str = str_repeat('a', 1024 * 1024); //$str = str_repeat('a', 1024); $temp = preg_replace('#.*?^-+[^-]+-+[\r\n ]*$#ms', '', $str, 1);

使用
stru repeat('a',1024)
时,
$temp
的长度为1024,而使用
stru repeat('a',1024*1024)
时,
$temp
的长度为0

我正在运行PHP7.4.3


可能是什么问题?

您实际上遇到了一个错误

$str = str_repeat('a', 1024 * 1024);
//$str = str_repeat('a', 1024);
$temp = preg_replace('#.*?^-+[^-]+-+[\r\n ]*$#ms', '', $str, 1);

echo strlen($temp);
关于此功能:

Process exited with code 137
最后$str变为
NULL
,并自动生成
strlen($temp)
实际上是
strlen(空)它为您提供
0


1024*1024=1048576

php.ini中pcre.backtrack_limit的默认设置为1000000

要解决此问题,请在php.ni文件中更改此设置

$temp = preg_replace('#.*?^-+[^-]+-+[\r\n ]*$#ms', '', $str, 1);

它是一个在php.ini中设置了字符限制的函数,用于处理正则表达式。默认情况下,它将是100000。给定的字符串长度1024*1024=1048576超出了限制。改变

pcre.backtrack_limit=1048577

在php.ini中重新启动apache,它将正常工作

应该看到。对于str_repeat('a',1024),$temp的长度是1024,但是对于str_repeat('a',1024*1024),$temp的长度实际上不是0。这显然与preg_replace有关。看起来您遇到了:
pcre.backtrack_limit=1048577