网站搜索

PHP 正则表达式不适用于很长的字符串(已解决)


preg_replace、preg_match_all 和 preg_match 函数不适用于长字符串

当尝试在 PHP 中使用正则表达式使用 preg_replace、preg_match_all 和 preg_match(或其他正则表达式搜索函数)进行搜索时,可能会出现以下问题:正在搜索的字符串恰好包含与搜索模式匹配的子字符串;但该函数没有输出匹配的字符串,而是什么也没找到。也没有输出任何错误。

自 PHP 5.2 起,PCRE 函数可应用的文本大小受到限制。默认情况下,PCRE 函数工作的最大文本大小为 100k。如果超过此限制,则不会输出任何错误消息,但也不会发现任何内容。

如何增加正则表达式搜索的字符串限制

出现了一个逻辑问题,如何增加 PCRE 函数的最大字符串长度限制。

您可以在 php.ini 文件中增加 PHP 中正则表达式搜索的最大字符串长度。

首先,找到这个文件:


locate php.ini

基于 Debian Linux 发行版(Ubuntu、Linux Mint、Kali Linux)的示例文件位置 - 请注意,文件位置取决于 PHP 版本:


/etc/php/8.2/apache2/php.ini

基于 Arch Linux Linux 发行版(Manjaro、BlackArch)的示例文件位置:


/etc/php/php.ini

以 root 身份打开 php.ini 文件:


sudo gedit /etc/php/php.ini

找到带有 pcre.backtrack_limit 的行:


;pcre.backtrack_limit=100000

取消注释此行(删除行开头的分号)并设置所需的限制:

保存并关闭该文件。

如果您在命令行上运行 PHP 脚本,您所做的更改应该立即生效。

如果您使用 Apache Web 服务器运行脚本,则需要重新启动此服务。

要在基于 Debian 的发行版(Ubuntu、Linux Mint、Kali Linux)上重新启动 Apache 服务,请运行以下命令:


sudo systemctl restart apache2.service

要在基于 Arch Linux 的发行版(Manjaro、BlackArch)上重新启动 Apache 服务,请运行以下命令:


sudo systemctl restart httpd.service

此后,更改应该生效。

如果您的问题没有解决,请尝试将限制增加到更高的值。

增加 pcre.backtrack_limit 是否安全

有一种观点认为,增加 pcre.backtrack_limit 可能会导致堆栈溢出并导致 Apache 服务崩溃。

显然,这些错误已经得到修复,因为在增加 pcre.backtrack_limit 后,我没有在现代版本的 PHP 和 Apache 中观察到任何问题。

相反,它解决了我在非常长的字符串和非常大的文本文件中进行正则表达式搜索的问题。