За последние 24 часа нас посетили 69606 программистов и 6730 роботов. Сейчас ищут 2104 программиста ...

Замена preg_replace на preg_replace_callback

Тема в разделе "PHP для новичков", создана пользователем vik2002, 2 апр 2018.

  1. vik2002

    vik2002 Новичок

    С нами с:
    2 апр 2018
    Сообщения:
    2
    Симпатии:
    0
    Приветствую всех. Сайт переезжает на PHP7. В связи с тем, что модификатор /e уже не актуален, надо поменять preg_replace на preg_replace_callback. Помогите, плиз. Не могу понять, как правильно написать callback-функцию. Так как надо не работает.

    Вот этот кусок кода:

    PHP:
    1. $find = ['/{id}/i', '/{name}/i', '/{parent}/i', '/{level}/i', '/{url}/i', '/{icon}/i', '/{template}/i', '/{prefix}/i', '/\[php\](.*?)\[\/php\]/ie', '/{description}/i'];
    2. $repl = [$row['id'], $row['name'], $row['parent'], $row['level'], $row['url'], ($row['icon'] ? '<img src="'.$row['icon'].'" alt="'.$row['icon'].'" border="0" align="absmiddle">' : ''), $row['template'], $pref, '\\1', replace_news('show', $row['description'])];
    3. $johnny_left_teat .= $pref . @preg_replace ($find, $repl, $tpl);
    Вся функция полностью вот. Выводит дерево категорий сайта.
    PHP:
    1. function category_get_tree($prefix = '', $tpl = '{name}', $no_prefix = true, $id = 0){
    2.     global $categories;
    3.     $minus = 0;
    4.     $johnny_left_teat = '';
    5.         if (empty($categories)){
    6.         return false;
    7.     }
    8.     foreach (sort_it($categories) as $row){
    9.        if ($id){
    10.            if ($id == $row['id']){
    11.                 $minus++;
    12.                 continue;
    13.            }
    14.            if (!in_array($row['id'], explode(',', category_get_children($id)))){
    15.                 $minus++;
    16.                 continue;    
    17.            }
    18.        }
    19.         $pref = ($no_prefix ? $row['level'] : ($row['level'] + 1));
    20.         $pref = ($minus ? ($pref - (!$no_prefix ? ($minus - 1) : ($minus - 1))) : $pref);
    21.         $pref = @str_repeat($prefix, $pref);
    22.         $find = ['/{id}/i', '/{name}/i', '/{parent}/i', '/{level}/i', '/{url}/i', '/{icon}/i', '/{template}/i', '/{prefix}/i', '/\[php\](.*?)\[\/php\]/ie', '/{description}/i'];
    23.         $repl = [$row['id'], $row['name'], $row['parent'], $row['level'], $row['url'], ($row['icon'] ? '<img src="'.$row['icon'].'" alt="'.$row['icon'].'" border="0" align="absmiddle">' : ''), $row['template'], $pref, '\\1', replace_news('show', $row['description'])];
    24.         $johnny_left_teat .= $pref . @preg_replace ($find, $repl, $tpl);
    25.     }
    26.    return $johnny_left_teat;
    27. }
     
  2. виталий032

    виталий032 Активный пользователь

    С нами с:
    31 янв 2014
    Сообщения:
    227
    Симпатии:
    30
    Адрес:
    Владивосток
    Символ собачки попробуй убрать. Говорят, его лучше вообще не использовать.

    Я так полагаю preg_replace работает, но не так как тебе хочется. Какой результат ($johny_left_teat) сейчас и какой нужен?
     
    vik2002 нравится это.
  3. vik2002

    vik2002 Новичок

    С нами с:
    2 апр 2018
    Сообщения:
    2
    Симпатии:
    0
    Спс за ответ. Результатом были пустые значения вместо параметров категорий (id, name, url...). Вчера переписали вывод категорий наново, сделали совсем по-другому. Так что, в принципе тема уже не актуальна.

    Хотя ради любопытства было бы интересно узнать, как правильно задать preg_replace_callback в указанном мной выше коде. Я пробовал что-то типа такого

    PHP:
    1. johnny_left_teat .= $pref . preg_replace_callback( $find, function ($repl) {return $repl[0];}, $tpl ) );
    и не работало.

    Как нужно?
     
    #3 vik2002, 4 апр 2018
    Последнее редактирование: 4 апр 2018