为什么此调用返回NULL?
正则表达式错了吗?使用test
输入时,它不会返回NULL。
文档说NULL表示错误,但可能是什么错误?
$s = hex2bin('5b5d202073205b0d0a0d0a0d0a0d0a20202020202020203a');
// $s = 'test';
$s = preg_replace('/\[\](\s|.)*\]/s', '', $s);
var_dump($s);
// PHP 7.2.10-1+0~20181001133118.7+stretch~1.gbpb6e829 (cli) (built: Oct 1 2018 13:31:18) ( NTS )
答案 0 :(得分:3)
您的正则表达式导致catastrophic backtracking并导致PHP正则引擎失败。您可以使用preg_last_error()
function进行检查。
$r = preg_replace("/\[\](\s|.)*\]/s", "", $s);
if (preg_last_error() == PREG_BACKTRACK_LIMIT_ERROR) {
print 'Backtrack limit was exhausted!';
}
输出:
Backtrack limit was exhausted!
由于此错误,您正在从NULL
获得preg_replace
的返回值。根据{{3}}:
如果找到匹配项,则将返回新主题,否则,主题将保持不变,或者如果发生错误,则返回 NULL 。
修复:使用(\s|.)
修饰符( DOTALL )时不需要s
。因为使用s
修饰符时点匹配任何字符,包括换行符。
您应该只使用此正则表达式:
$r = preg_replace('/\[\].*?\]/s', "", $s);
echo preg_last_error();
//=> 0