2016-01-07 9 views
3

Я ищу функцию PHP, которую я могу использовать для редактирования пар ключ/значение в текстовом файле.PHP-функция для редактирования файла конфигурации

То, что я хочу сделать (PHP):

changeValue(key, bar); 

и имеют в setings.txt:

key = foo 
key2 =foo2 

Изменение к:

key = bar 
key2 = foo2 

То, что я получил так далеко (не работает):

function changeValue($input) { 
    $file = file_get_contents('/path/to/settings.txt'); 
    preg_match('/\b$input[0]\b/', $file, $matches); 
    $file = str_replace($matches[1], $input, $file); 
    file_put_contents('/path/to/settings.txt', $file); 
} 

How to update an ini file with php? меня начал. Я прочитал много других вопросов, но я не мог заставить его работать.

+0

Я хочу использовать это для хранения и изменения небольших строк данных, которые пользователь вводит на веб-страницу. – PeteM

+0

Я предполагаю, что это устаревший код, и поэтому вы не используете Yaml или что-то в этом роде. Управление конфигурационными файлами изначально с помощью PHP - это боль в патетике. Есть и другие способы сделать это лучше, ямль является одним из них. – Halfstop

+0

Пользователь - я, и я буду использовать около 10 значений. Я хотел бы сохранить это как можно проще, но я посмотрю на Ямла. – PeteM

ответ

2

Я бы использовал JSON с по меньшей мере JSON_PRETTY_PRINT вариантами для записи и json_decode() для чтения.

// read file into an array of key => foo 
$settings = json_decode(file_get_contents('/path/to/settings.txt'), true); 

// write array to file as JSON 
file_put_contents('/path/to/settings.txt', json_encode($settings, JSON_PRETTY_PRINT)); 

Какой будет создать файл, например:

{ 
    "key": "foo", 
    "key2": "bar", 
    "key3": 1 
} 

Другая возможность заключается в var_export() с использованием аналогичного подхода, или еще один простой пример того, что вы спрашиваете:

// read file into an array of key => foo 
$string = implode('&', file('/path/to/settings.txt', FILE_IGNORE_NEW_LINES)); 
parse_str($string, $settings); 

// write array to file as key=foo 
$data = implode("\n", $settings); 
file_put_contents('/path/to/settings.txt', $data); 

Так прочитайте в файле, измените настройку $setting['key'] = 'bar';, а затем запишите ее.

+0

Это не сработает, потому что часто в текстовых файлах '\ n' не всегда является единственным специальным символом разрыва и может вызвать много ошибок обработки. – Derek

+0

Я изучу это. Чтобы четко прояснить, в файле есть несколько пар ключ/значение (около 10). Я также отредактирую вопрос, чтобы отразить это. – PeteM

+0

Я могу работать с ограничениями, например, без пробелов или без определенных символов, если я их знаю. – PeteM

2

Вместо использования файла file_get_contents этот файл считывает каждую строку в виде массива. Под вами рабочий код. Если бы небольшая проблема с массивом записи добавила больше перерывов, но не была уверенна в чем.

changeValue("key", "test123"); 

function changeValue($key, $value) 
{ 
    //get each line as an array. 
    $file = file("test.txt"); 

    //go through the array, the value is references so when it is changed the value in the array is changed. 
    foreach($file as &$val) 
    { 
     //check if the string line contains the current key. If it contains the key replace the value. substr takes everything before "=" so not to run if the value is the same as the key. 
     if(strpos(substr($val, 0, strpos($val, "=")), $key) !== false) 
     { 
      //clear the string 
      $val = substr($val, 0, strpos($val, "=")); 
      //add the value 
      $val .= "= " . $value; 
     } 
    } 
    //send the changed array writeArray(); 
    writeArray($file); 
} 

function writeArray($array) 
{ 
    $str = ""; 
    foreach($array as $value) 
    { 
     $str .= $value . "\n"; 
    } 

    //write the array. 
    file_put_contents('test.txt', $str); 
} 

?> 
+0

Это выглядит очень многообещающе. Не могли бы вы добавить комментарий к коду, чтобы я мог узнать, как он работает? – PeteM

+0

Что-то вроде этого? – Nyranith

+0

Это абсолютно фантастично, спасибо! – PeteM