PCRE2 Yii2 pattern PHP7.3
В связи с переходом на версию PHP 7.3 перестала работать проверка на корректность введенных данных в форму (yii2 pattern). При отправке формы на проверку yii2 выдает следующую ошибку
preg_match(): Compilation failed: invalid range in character class at offset 6
Ошибка «preg_match(): Compilation failed: invalid range in character class at offset 6» появляется в vendor\yiisoft\yii2\validators\RegularExpressionValidator.php, так как yii2 pattern который находиться в модели не проходит проверку RegularExpressionValidator.php at line 56– preg_match(‘/^[\d\s-\+\(\)]+$/’, ‘89990000000’) в версии PHP 7.1-7.2 все работало.
Для примера взял форму обратной связи (модель обратной связи models\Feedback.php)
Изначально была вот такая вот проверка телефона, но перестала работать с переходом на PHP7.3
1 2 3 4 5 6 7 8 | public function rules() { return [ ..... ['phone', 'match', 'pattern' => '/^[\d\s-\+\(\)]+$/'], ..... ]; } |
Так вот, как написано в источнике о переходе в PHP7.3 вместо PCRE на PCRE2
С появлением набора PCRE2_EXTRA_BAD_ESCAPE_IS_LITERAL escape-последовательности, такие как \s, допустимые в символьных классах, но не в качестве конца диапазонов, рассматривались как литералы. Примером является [_-\s] (но не [\s -_], потому что это дало ошибку в начале диапазона). Теперь ошибка «недопустимый диапазон» задается независимо от PCRE2_EXTRA_BAD_ESCAPE_IS_LITERAL.
Документация PCRE2 pattern
Поставил один знак \ после s и все заработало (‘/^[\d\s\-\+\(\)]+$/’).
1 | ['phone', 'match', 'pattern' => '/^[\d\s\-\+\(\)]+$/'], |
Да уж, серьезное обновление из-за которого пол дня голову ломал