Warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead - dir/file.php (номер строки)
Это сообщение говорит о том, что модификатор
e
не существует в PHP 7, следует избавляться от него, но если просто удалить данный модификатор, сценарий может выполнятся неправильно, непросто же так его туда писали. Я покажу на примере кода из PHPFOX 3 (как я переписывал код: PHPFOX 3 переход на PHP 7), делаем так:
Например, у нас сообщение ошибки указывает на такую строчку:
$sStr = preg_replace('/\[x=(\d+)\].+?\[\/x\]/ise', "''.stripslashes(\$this->_parseUserTagged('$1')).''", $sStr);
Её следует изменить так:
$sStr = preg_replace_callback(
'/\[x=(\d+)\].+?\[\/x\]/is',
function($match)
{
return stripslashes($this->_parseUserTagged($match[1]));
},
$sStr);
Тут мы заменили функцию preg_replace(), на preg_replace_callback(), удалили модификатор
e
в первом аргументе, которым является регулярное выражение. Второй аргумент заменили анонимной функцией, которая будет выполнятся после применения регулярного выражения. Анонимная функция содержит массив $match
, элементы массива заменяют совпадения, например, было: $1
, стало: $match[1]
; было: $2
, стало: $match[2]
, и так далее. Убрали кавычки и символ экранирования (обратный слеш \
).В завершении об ошибки несуществующего модификатора
e
, покажу ещё пару примеров замены кода. Строку:
$aRow['value_actual'] = preg_replace("/s:(.*):\"(.*?)\";/ies", "'s:'.strlen('$2').':\"$2\";'", $aRow['value_actual']);
Меняем так:
$aRow['value_actual'] = preg_replace_callback(
'/s:(.*):\"(.*?)\";/is',
function($match)
{
return 's:' . strlen($match[2]) . ':"' . $match[2] . '";';
},
$aRow['value_actual']);
И пример с переменной в регулярном выражении, строка:
$sTxt = preg_replace('/\[' . $sBbcode . '=(.*?)\]/ise', "''.\$this->_replaceBbCode('' . \$sBbcode . '', 'prefix', true, '$1').''", $sTxt);
Заменяется так:
$sTxt = preg_replace_callback(
'/\[' . $sBbcode . '=(.*?)\]/is',
function($match) use($sBbcode)
{
return $this->_replaceBbCode($sBbcode, 'prefix', true, $match[1]);
},
$sTxt);
Тут мы добавили функцию
use()
, в которую поместили переменную из регулярного выражения, тем самым передали переменную в анонимную функцию. Если переменных в регулярном выражении будет больше одной, то просто перечисляем их через запятую, пример:
function($match) use($a, $b, $c)
Устаревшая функция ereg_replace()
Как сообщил официальный сайт PHP: http://php.net/:
С версии PHP 5.3.0 эта функция считается УСТАРЕВШЕЙ. Крайне не рекомендуется полагаться на эту возможность.
А уж в PHP 7 про неё вообще забыли... Можно получить такое сообщение об ошибки:
Fatal error: Uncaught Error: Call to undefined function ereg_replace()
Эту функцию следует заменить на preg_replace(), следуя примеру ниже. Допустим у нас такая строка кода:
$str = ereg_replace('[^ -<>-}]', ' ', str_replace("\x00", ' ', $originalcommentname));
Изменяем код так:
$str = preg_replace('/[^ -<>-}]/', ' ', str_replace("\x00", ' ', $originalcommentname));
То есть: ereg_replace заменили на: preg_replace, в начало и конец регулярного выражения добавили слеши.
Тоже самое и с функцией ereg.
Замена MYSQL_* на MYSQLI_*
Функции mysql_* уже давно были объявлены устаревшими, а в PHP 7 они удалены, есть mysqli_*, вот на эти функции и будем менять.
И так, например, сейчас у нас такой код:
$db = mysql_connect($dbhost, $dbuser, $dbpass);
mysql_select_db($name, $db);
Эти две функции меняем на одну:
$db = mysqli_connect($dbhost, $dbuser, $dbpass, $dbname);
Функцию:
mysql_set_charset('utf8');
Меняем так:
mysqli_set_charset($db, 'utf8');
Функцию выполнения запроса:
$result = mysql_query($query);
Меняем на:
$result = mysqli_query($db, $query);