PHP

Ошибка в регулярных выражениях роутов Yii2 в PHP7.3

Недавно занимался отладкой старого приложения на 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 of PCRE2_EXTRA_BAD_ESCAPE_IS_LITERAL.

Как сконвертировать PDF в изображение (JPG, PNG) с помощью PHP

Это можно сделать с помощью Imagick, но это не очень удобно:

$imagick = new Imagick('file.pdf[0]');
$imagick->setImageFormat('jpg');
file_put_contents($pathToImage, $imagick);

Вместо этого можно подключить пакет spatie/pdf-to-image ( composer require spatie/pdf-to-image ) и использовать его:

$pdf = new Spatie\PdfToImage\Pdf('file.pdf');
$pdf->saveImage($pathToImage);

Вы можете явно указать расширение файла в $pathToImage. Если не укажите, то изображение по-умолчанию сохранится в JPG.