Недавно занимался отладкой старого приложения на Yii2 и встретил странную ошибку:
yiibaseErrorException: preg_match(): Compilation failed: invalid range in character class at offset 376 in .../vendor/yiisoft/yii2/web/UrlRule.php
Понятно: что-то не так с роутами в конфигах. Отследил, с какими конкретно роутами проблема, и вот что оказалось:
preg_match('/[w-.]+/', ''); // Этот код не будет работать в PHP7.3
preg_match('/[w\-.]+/', ''); // Это работает в PHP7.3, необходимо экранировать дефис
Дело в том, что в PHP7.3 обновился движок регулярных выражений с PCRE на PCRE2. Вот выдержка из списка обновлений PHP7.3:
With
PCRE2_EXTRA_BAD_ESCAPE_IS_LITERAL
set, escape sequences such as\s
which are valid in character classes, but not as the end of ranges, were being treated as literals. An example is[_-\s]
(but not[\s-_]
because that gave an error at the start of a range). Now an «invalid range» error is given independently ofPCRE2_EXTRA_BAD_ESCAPE_IS_LITERAL
.