За последние 24 часа нас посетили 23777 программистов и 1604 робота. Сейчас ищут 833 программиста ...

Как изменить часть файла

Тема в разделе "PHP для новичков", создана пользователем SamyRed, 12 май 2016.

  1. SamyRed

    SamyRed Старожил

    С нами с:
    23 июл 2015
    Сообщения:
    1.196
    Симпатии:
    111
    Адрес:
    Украина
    Здравствуйте, уважаемые форумчане. Помогите, пожалуйста реализовать слудующее:
    У меня есть файл "config.php", в котором содержится какой-то текст:
    Код (PHP):
    1. $conf = array(
    2.  
    3.     "sitename" => "Samy Engine - система управления сайтом для Minecraft", //Название сайта
    4.    
    5.     "forumname" => "SE - форум", //Название форума
    6.    
    7.     "siteaddr" => "new.samycraft.com", //Адрес главной страницы сайта
    8.    
    9.     "forumaddr" => "new.samycraft.com?pg=forum", //Адрес главной страницы форума
    10.    
    11.     "sitedesc" => "Проект игровых серверов по игре Minecraft", //Описание сайта
    12.    
    13.     "forumdesc" => "Форум проекта SE", // Описание форума
    14.    
    15.     "sitemeta" => array("Сайт", "SE", "CMS", "Minecraft", "SamyEngine"), // Мета теги сайта
    16.    
    17.     "forummeta" => array("Форум", "SE", "CMS", "Minecraft", "SamyEngine"), //Мета теги форума для поисковых систем
    18.    
    19.     "debug" => false, //Включена ли отладка
    20.    
    21.     "siteoff" => false, //Выключен ли сайт
    22.    
    23.     "siteoff_msg" => "Сайт временно отключен по техническим причинам!", //Сообщение при выключенном сайте
    24.  
    25. );
    В этом файле мне нужно изменить, например, это:
    Код (PHP):
    1. "sitemeta" => array("Сайт", "SE", "CMS", "Minecraft", "SamyEngine"), // Мета теги сайта
    Если не сложно, подскажите. Идеально будет с примерами. Спасибо.
     
  2. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    ну измени
     
  3. SamyRed

    SamyRed Старожил

    С нами с:
    23 июл 2015
    Сообщения:
    1.196
    Симпатии:
    111
    Адрес:
    Украина
    Ну так не просто же изменять надо, а програмно, через php. Напимер, пользователь изменяет массив "sitemeta", и он должен измениться в этом файле.
     
  4. Basilio

    Basilio Случайный прохожий

    С нами с:
    6 апр 2016
    Сообщения:
    191
    Симпатии:
    54
    Нужно более точно сформулировать задачу. В данном конкретном случае проще всего взять данный массив в пхп, изменить в нем то, что нужно - опять же, средствами работы с массивами в пхп, а потом просто создать config.php заново, сохранив туда этот массив простейшим foreach. Но тут есть подводный камень - если в этом файле может быть что-то помимо этого массива - то это требует дополнительной обработки уже.
     
  5. SamyRed

    SamyRed Старожил

    С нами с:
    23 июл 2015
    Сообщения:
    1.196
    Симпатии:
    111
    Адрес:
    Украина
    В файле хранится много переменных. Среди них и булеаны и строки и массивы. И в зависимости от того что указал пользователь, нужно заменять определённую переменную, или даже несколько переменных.
     
  6. TeslaFeo

    TeslaFeo Старожил

    С нами с:
    9 мар 2016
    Сообщения:
    2.984
    Симпатии:
    759
    А почему бы не хранить эти данные в БД?
     
  7. SamyRed

    SamyRed Старожил

    С нами с:
    23 июл 2015
    Сообщения:
    1.196
    Симпатии:
    111
    Адрес:
    Украина
    То что их можно хранить в БД это понятно. Но у меня есть конкретный случай. И нужно как-то выкручиваться.
     
  8. Basilio

    Basilio Случайный прохожий

    С нами с:
    6 апр 2016
    Сообщения:
    191
    Симпатии:
    54
    Если есть статичный файл с произвольным содержимым, в котором произвольным образом может что-то меняться - тут два варианта:
    1. Писать парсер этого файла, который будет сначала считывать всю структуру, запоминать ее, потом вносить изменения, и потом сохранять все обратно в том же порядке в соответствии с запомненной структурой. Это реализуемо, но по-моему чрезмерное усложнение.
    2. Оставить исходный файл как есть, и к нему подгружать чисто изменения - их хранить либо в базе, либо в отдельном файлике, где хранить сериализованный массив, содержащий инструкции - где и что поменять.
     
  9. SamyRed

    SamyRed Старожил

    С нами с:
    23 июл 2015
    Сообщения:
    1.196
    Симпатии:
    111
    Адрес:
    Украина
    А возможно ли как-то сделать это с помощью str_replace, или подобного?
    Например,
    1) брать содержимое,
    2) искать там то что начинается, к примеру, на "sitemeta"=>array(, и заканчивается ),// Мета теги сайта,
    3) Заменять что надо и переписывать этот файл уже с заменённым содержимым?
    Я просто не знаю как выполнить пункт 2.
     
  10. Basilio

    Basilio Случайный прохожий

    С нами с:
    6 апр 2016
    Сообщения:
    191
    Симпатии:
    54
    Можно, но это потребует довольно объемного и громоздкого кода. Что мешает пойти более легким путем?
     
  11. SamyRed

    SamyRed Старожил

    С нами с:
    23 июл 2015
    Сообщения:
    1.196
    Симпатии:
    111
    Адрес:
    Украина
    Ну, если ты заметил в каком разделе находится тема))) Я не совсем понимаю как это реализовать. Можно тогда примерчик небольшой? Буду разбираться))
     
  12. SamyRed

    SamyRed Старожил

    С нами с:
    23 июл 2015
    Сообщения:
    1.196
    Симпатии:
    111
    Адрес:
    Украина
    Желательно пример первого варианта, поскольку не хочу создавать 100500 лишних файлов, в которых будет храниться по 1 строке.
     
  13. Basilio

    Basilio Случайный прохожий

    С нами с:
    6 апр 2016
    Сообщения:
    191
    Симпатии:
    54
    Давай тогда уж подробнее. Приведи пример того, при каких условиях и какие изменения могут вноситься в данный файл.
     
  14. SamyRed

    SamyRed Старожил

    С нами с:
    23 июл 2015
    Сообщения:
    1.196
    Симпатии:
    111
    Адрес:
    Украина
    Смотри. У меня есть файл, (часть его можно увидеть в начале темы). Есть панель управления, в которой пользователь будет менять параметры, которые хранятся в файле. Например, я хочу поменять элемент массива $conf, а именно $conf["sitemeta"], который уже генерируется из строки, которую в ПУ вводит пользователь. Собственно, не знаю что ещё нужно объяснять. Даже, скажем так что таких массивов как $conf в файле есть 3 ($conf, $confmodules, $confdb), но мне нужно изменить только все элементы массива $conf.
     
  15. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    SamyRed нравится это.
  16. SamyRed

    SamyRed Старожил

    С нами с:
    23 июл 2015
    Сообщения:
    1.196
    Симпатии:
    111
    Адрес:
    Украина
    Спасибо. Именно то что мне нужно. Лайк тебе) Осталось только разобраться как пользоваться этим var_export'ом
     
  17. Basilio

    Basilio Случайный прохожий

    С нами с:
    6 апр 2016
    Сообщения:
    191
    Симпатии:
    54
    Этот вариант годный в том случае, если там фиксированный набор этих самых массивов. Если их там ровно 3, и ничего другого не предвидится - то просто не паришься, и сохраняешь все три массива в файл var_export()'ом.
     
  18. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    а какие ещё могут быть варианты?
     
  19. SamyRed

    SamyRed Старожил

    С нами с:
    23 июл 2015
    Сообщения:
    1.196
    Симпатии:
    111
    Адрес:
    Украина
    У меня именно фиксированное количество. Это конфиг файл. Там по идеи ничего больше не будет. Возможно только потом буду дописывать нужные значения.
     
  20. Basilio

    Basilio Случайный прохожий

    С нами с:
    6 апр 2016
    Сообщения:
    191
    Симпатии:
    54
    Любые. Зависит от движка. Теоретически в файле конфига может быть произвольное количество всякого непредсказуемого барахла.
    --- Добавлено ---
    Ну и многие любят всякие ini_set() тоже пихать в файл конфига.
     
  21. SamyRed

    SamyRed Старожил

    С нами с:
    23 июл 2015
    Сообщения:
    1.196
    Симпатии:
    111
    Адрес:
    Украина
    Не, я таким не занимаюсь. Если потребуется, сделаю файл php.ini.
    --- Добавлено ---
    А можно ли использовать этот var_export так чтобы вообще не трогать содержимое файла, кроме того что мне нужно? А то, как я понял, нужно брать всё содержимое файла и заменять то что нужно, но тогда другие значения, которые уже там хранятся тоже нужно переписывать но без изменений. А это лишний код.
     
  22. Хыиуду

    Хыиуду Активный пользователь

    С нами с:
    3 июн 2014
    Сообщения:
    618
    Симпатии:
    5
    preg_replace('~\$conf.*?\);~is', '$conf = '.var_export($new_conf,1), $text)
    Иными словами, заменяем всю часть конфига из переменной $text, начиная с $conf и кончая );, на $conf = (новое содержимое твоего конфига)
     
    SamyRed нравится это.
  23. SamyRed

    SamyRed Старожил

    С нами с:
    23 июл 2015
    Сообщения:
    1.196
    Симпатии:
    111
    Адрес:
    Украина
    Угу. Спасибо.
    --- Добавлено ---
    Ещё 1 вопрос, если использовать вариант Хыиуду, не будет ли никаких ошибок если в файле содержатся ещё строки ");", но именно та, до которой нужно заменять - самая первая?
     
  24. machetero

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

    С нами с:
    25 окт 2014
    Сообщения:
    499
    Симпатии:
    21
    Если понадобится создать массив из того что выдал вар_экспорт используй eval()
     
  25. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Для очистки совести скажу что так делать не надо вообще.