php中,用preg_match_all()正则检测600k左右长度字符串的合法性

WBOY
Release: 2016-06-06 20:10:39
Original
1142 people have browsed it

600K左右的字符串,是数字+分隔符。因为是用户提交的,所以要检测是否合法。我这里用preg_match_all+正则来检测,字符串短的时候,是可以检测的,没有问题,当字符串超过100k的时候,nginx就会502
我也查到了问题所在,pcre中设定了回溯值
后来,我根据网上给出的解决方法

<code>ini_set("pcre.backtrack_limit",1000000);</code>
Copy after login
Copy after login

依然是502
正则代码是:

<code>/^(\d{5}(&|$)){1,}$/</code>
Copy after login
Copy after login

字符串格式是:

<code>12345&12346&12347&……99999</code>
Copy after login
Copy after login

请问有别的方法可以解决这个问题吗?
或者是我哪里的设置不对?

回复内容:

600K左右的字符串,是数字+分隔符。因为是用户提交的,所以要检测是否合法。我这里用preg_match_all+正则来检测,字符串短的时候,是可以检测的,没有问题,当字符串超过100k的时候,nginx就会502
我也查到了问题所在,pcre中设定了回溯值
后来,我根据网上给出的解决方法

<code>ini_set("pcre.backtrack_limit",1000000);</code>
Copy after login
Copy after login

依然是502
正则代码是:

<code>/^(\d{5}(&|$)){1,}$/</code>
Copy after login
Copy after login

字符串格式是:

<code>12345&12346&12347&……99999</code>
Copy after login
Copy after login

请问有别的方法可以解决这个问题吗?
或者是我哪里的设置不对?

即使设置了pcre.backtrack_limit还是有可能崩溃的,因为巨大的回溯可能会爆栈,这是系统级别的限制,PHP也左右不了。建议你选用其他方法来处理这些内容,比如先分割,在循环检查每个小段。

Related labels:
php
source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template