Почему этот вызов preg_replace возвращает NULL? - PullRequest
0 голосов
/ 26 октября 2018

Почему этот вызов возвращает 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 )

1 Ответ

0 голосов
/ 26 октября 2018

Ваше регулярное выражение вызывает катастрофический откат и приводит к отказу движка PHP-регулярных выражений. Вы можете использовать preg_last_error() функцию , чтобы проверить это.

$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 из-за этой ошибки. Согласно PHP документ preg_replace:

Если совпадения найдены, новая тема будет возвращена, в противном случае тема будет возвращена без изменений или NULL, если произошла ошибка .


Исправлено: Вам не нужно (\s|.) при использовании модификатора s ( DOTALL ). поскольку точка соответствует любому символу, включая символ новой строки, при использовании модификатора s.

Вы должны просто использовать это регулярное выражение:

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