Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 为什么这个preg_replace调用返回NULL?_Php_Regex_Pcre - Fatal编程技术网

Php 为什么这个preg_replace调用返回NULL?

Php 为什么这个preg_replace调用返回NULL?,php,regex,pcre,Php,Regex,Pcre,为什么这个调用返回NULL? 正则表达式错了吗?对于测试输入,它不会返回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~

为什么这个调用返回NULL? 正则表达式错了吗?对于
测试
输入,它不会返回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 )
您的正则表达式正在导致PHP正则表达式引擎失败。您可以使用来检查这个

$r = preg_replace("/\[\](\s|.)*\]/s", "", $s);
if (preg_last_error() == PREG_BACKTRACK_LIMIT_ERROR) {
    print 'Backtrack limit was exhausted!';
}
输出:

Backtrack limit was exhausted!
由于此错误,您正在从
preg\u replace
获取
NULL
返回值。根据:

如果找到匹配项,将返回新主题,否则主题将返回不变,如果出现错误,则返回NULL


修复:使用
s
修饰符(DOTALL)时不需要
(\s |)。
。因为在使用
s
修饰符时,点匹配任何字符,包括换行符

您应该只使用以下正则表达式:

$r = preg_replace('/\[\].*?\]/s', "", $s);
echo preg_last_error();
//=> 0
您的正则表达式正在导致PHP正则表达式引擎失败。您可以使用来检查这个

$r = preg_replace("/\[\](\s|.)*\]/s", "", $s);
if (preg_last_error() == PREG_BACKTRACK_LIMIT_ERROR) {
    print 'Backtrack limit was exhausted!';
}
输出:

Backtrack limit was exhausted!
由于此错误,您正在从
preg\u replace
获取
NULL
返回值。根据:

如果找到匹配项,将返回新主题,否则主题将返回不变,如果出现错误,则返回NULL


修复:使用
s
修饰符(DOTALL)时不需要
(\s |)。
。因为在使用
s
修饰符时,点匹配任何字符,包括换行符

您应该只使用以下正则表达式:

$r = preg_replace('/\[\].*?\]/s', "", $s);
echo preg_last_error();
//=> 0

你需要在这里做什么?您的
$s
没有第二个
]
,因此没有匹配项。另外,
(\s |。)*
不是必需的,这是不好的,只需使用
*
preg\u replace(“/\[].]/s”,”,$s)
)在regexp周围使用单引号,而不是双引号也是一个好主意。否则,您将面临将regexp转义序列作为字符串转义序列处理的风险。@WiktorStribiżew我主要想知道为什么它返回NULL。如果没有匹配项,应该返回输入,不是吗?如果regexp无效,它将返回
NULL
(\s|)的意义是什么
已经匹配了
\s
。您需要在这里做什么?您的
$s
没有第二个
]
,因此没有匹配项。另外,
(\s |。)*
不是必需的,这是不好的,只需使用
*
preg\u replace(“/\[].]/s”,”,$s)
)在regexp周围使用单引号,而不是双引号也是一个好主意。否则,您将面临将regexp转义序列作为字符串转义序列处理的风险。@WiktorStribiżew我主要想知道为什么它返回NULL。如果没有匹配项,应该返回输入,不是吗?如果regexp无效,它将返回
NULL
(\s|)的意义是什么<代码>
已经匹配了
\s
。。