За последние 24 часа нас посетили 20755 программистов и 1109 роботов. Сейчас ищет 371 программист ...

подстановка в переменную динамических значений {name} из переменных $name

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

  1. ufaclub

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

    С нами с:
    29 авг 2011
    Сообщения:
    55
    Симпатии:
    0
    есть переменная в ней хранится вот такой к примеру текст

    PHP:
    1. $description_avito ="{objname} толщиной {fat} применяется как облицовочный материал для потолков, стен, ограждений и т.д., а также в качестве кровельного покрытия";

    есть переменная

    PHP:
    1. $objname="Профнастил Н10-40 ";
    2. $fat="0.5 мм ";
    как мне сделать вывод echo $description_avito;

    чтобы получилось


    Профнастил Н10-40 толщиной 0.5 мм применяется как облицовочный материал для потолков, стен, ограждений и т.д., а также в качестве кровельного покрытия


    т.е преобразовывать то что в {} в переменную.
     
  2. Aleksandr.B

    Aleksandr.B Новичок

    С нами с:
    2 фев 2023
    Сообщения:
    150
    Симпатии:
    39
    Адрес:
    Барнаул
    PHP:
    1. $description_avito = "{objname} толщиной {fat} применяется как облицовочный материал для {test} потолков, стен, ограждений и т.д., а также в качестве кровельного покрытия";
    2. $objname = "Профнастил Н10-40 ";
    3. $fat = "0.5 мм ";
    4.  
    5. echo buildMessage($description_avito, compact('objname', 'fat'));
    6.  
    7. function buildMessage(string $message, array $data): string
    8. {
    9.     return preg_replace_callback(
    10.         '/{(.*?)}/i',
    11.         fn($matches) => $data[$matches[1]] ?? $matches[0],
    12.         $message
    13.     );
    14. }
     
  3. antoniii

    antoniii Новичок

    С нами с:
    16 мар 2022
    Сообщения:
    417
    Симпатии:
    71
    А зачем ты в регулярном выражении заключил .* в скобки?
     
  4. Aleksandr.B

    Aleksandr.B Новичок

    С нами с:
    2 фев 2023
    Сообщения:
    150
    Симпатии:
    39
    Адрес:
    Барнаул
    Чтоб в $matches[0] оставить то для чего нет замены, но это как вариант.
     
  5. antoniii

    antoniii Новичок

    С нами с:
    16 мар 2022
    Сообщения:
    417
    Симпатии:
    71
    Интересно. А для чего может не быть замены, я туплю. (Правда)
     
  6. Aleksandr.B

    Aleksandr.B Новичок

    С нами с:
    2 фев 2023
    Сообщения:
    150
    Симпатии:
    39
    Адрес:
    Барнаул
    Например, часть обработки в одном месте, а часть - в другом.
     
    #6 Aleksandr.B, 2 июн 2023
    Последнее редактирование: 2 июн 2023
  7. antoniii

    antoniii Новичок

    С нами с:
    16 мар 2022
    Сообщения:
    417
    Симпатии:
    71
    Спасибо тебе за ответы. Может у кого то тоже будут такие же вопросы, как у меня. Еще интересна работа функции fn($matches). Хотелось бы понять, для чего она используется.
     
  8. Aleksandr.B

    Aleksandr.B Новичок

    С нами с:
    2 фев 2023
    Сообщения:
    150
    Симпатии:
    39
    Адрес:
    Барнаул
    preg_replace_callback - нужно передать callback-функцию, которой будет передан массив совпавших элементов из строки. Callback-функция должна вернуть строку с заменой.
     
  9. Drunkenmunky

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

    С нами с:
    12 авг 2020
    Сообщения:
    1.476
    Симпатии:
    281
    Замените ваш "к примеру текст" на такой
    Код (Text):
    1.  
    2. $description_avito ="%2$s толщиной %1$s применяется как облицовочный материал для потолков, стен, ограждений и т.д., а также в качестве кровельного покрытия";
    И тогда не придется прибегать к g-кодингу
    Вот всё, что вам понадобится
    PHP:
    1. <?php
    2. $description_avito = "%1$s толщиной %2$s применяется как облицовочный материал для потолков, стен, ограждений и т.д., а также в качестве кровельного покрытия";
    3. $objname           = "Профнастил Н10-40 ";
    4. $fat               = "0.5 мм ";
    5.  
    6. printf($description_avito, $objname, $fat);
    7. ?>
     
    #9 Drunkenmunky, 3 июн 2023
    Последнее редактирование: 3 июн 2023
  10. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.734
    Симпатии:
    1.315
    Адрес:
    Лень
    strtr используй, в массиве ключ "{...}" => "текст"
    Никакие регулярки не нужны
     
    don.bidon нравится это.
  11. antoniii

    antoniii Новичок

    С нами с:
    16 мар 2022
    Сообщения:
    417
    Симпатии:
    71
    При всей простоте и эффективности оба эти способа не дают дружественного способа написания шаблона страницы. Можете кидать в меня тухлыми яйцами, но {...} внутри тегов гораздо проще в написании.
     
  12. Drunkenmunky

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

    С нами с:
    12 авг 2020
    Сообщения:
    1.476
    Симпатии:
    281
    Кстати, косяк. В коде выше, где printf(), значение $description_avito нужно заключать в одинарные кавычки или же экранировать символ $

    Типа
    Код (Text):
    1.  
    2. $description_avito = "%1\$s толщиной %2\$s применяется как облицовочный материал для потолков, стен, ограждений и т.д., а также в качестве кровельного покрытия";
    --- Добавлено ---
    Не буду. Через это все проходят