php5.5 и DLE9.7

@ya
На сайте с 17.04.2009
Offline
101
@ya
931

Помогите разобраться. Сайт достался пиленный-перепиленный, поэтому обновляться до последней версии - не вариант.

Обновил php c 5.3 до 5.5 и пошли ошибки вроде

Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in www/engine/modules/show.short.php on line 384

Берут этот show.short.php и заменяю

$tpl->copy_template = preg_replace( "#\\[category=(.+?)\\](.*?)\\[/category\\]#ies", "check_category('\\1', '\\2', '{$category_id}')", $tpl->copy_template );

на

$tpl->copy_template = preg_replace_callback ( "#\\[(category)=(.+?)\\](.*?)\\[/category\\]#is", "check_category", $tpl->copy_template );}

Ошибка пропадает, всё работает.

Беру следующую ошибку

//$tpl->copy_template = preg_replace ( "#{topmenu=(.+?)}#ies", "InsertTopMenu('\\1')", $tpl->copy_template );

заменяю на

$tpl->copy_template = preg_replace_callback ( "#{topmenu=(.+?)}#is", "InsertTopMenu('\\1')", $tpl->copy_template );

ошибка пропадает и ничего не работает (должно подгружать верхнее меню)

Если кто понимает в preg_replace_callback или dle, подскажите как надо.

R
На сайте с 20.02.2015
Offline
59
#1

e модификатор это - выполнение подстановки (\\n). Начиная с версии 5.5 политика безопасности, подробнее тут http://php.net/manual/en/reference.pcre.pattern.modifiers.php и там же решение(анонимные функции или безымянные функции).


//$tpl->copy_template = preg_replace( "#\\[category=(.+?)\\](.*?)\\[/category\\]#ies", "check_category('\\1', '\\2', '{$category_id}')", $tpl->copy_template );
$tpl->copy_template = preg_replace_callback (
"#\\[category=(.+?)\\](.*?)\\[/category\\]#is",
function ($m) {
global $category_id;
return check_category($m[1], $m[2], $category_id);
}
$tpl->copy_template
);

//$tpl->copy_template = preg_replace_callback ( "#{topmenu=(.+?)}#is", "InsertTopMenu('\\1')", $tpl->copy_template );
$tpl->copy_template = preg_replace_callback (
"#{topmenu=(.+?)}#is",
function ($m) {
return InsertTopMenu($m[1]);
}
$tpl->copy_template
);
@ya
На сайте с 17.04.2009
Offline
101
@ya
#2

Спасибо большое. Я по примеру dle 10.4 пробовал делать, как-то не пошло.

Ваш вариант работает, только запятой не хватает

$tpl->copy_template = preg_replace_callback ( "#{topmenu=(.+?)}#is",	function ($m) {return InsertTopMenu($m[1]);}, $tpl->copy_template );

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий