2015-10-20 3 views
4

У меня есть файл конфигурации со следующим содержимым;PHP preg_replace между строкой и кавычками

[settings] 
; absolute path to the temp dir. If empty the default system tmp directory will be used 
temp_path = "" 

; if set to true: detects if the contents are UTF-8 encoded and if not encodes them 
; if set to false do nothing 
encode_to_UTF8 = "false" 

; default document language 
language = "en-US" 

; default paper size 
paper_size = "A4" 

[license] 
; license code 
code = "8cf34efe0b57013668df0dbcdf8c82a9" 

мне нужно заменить ключ между кодом = «*» к чему-то еще, как я могу сделать это с preg_replace()? Файл конфигурации содержит больше параметров, поэтому мне нужно только заменить ключ между

code = "*replace me*" 

Это должно быть что-то вроде этого;

$licenseKey = 'newLicenseKey'; 
$configFileContent = file_get_contents(configFile.ini); 
$configFileContent = preg_replace('/(code = ")(.*)(")/', $licenseKey, $configFileContent); 

Но это заменяет всю строку только новым лицензионным ключом.

Как я могу это сделать?

+0

вы можете вставить пример вывода? и что вы пробовали до сих пор? –

+0

Я обновил свой пост выше. – Lumix1991

+1

что, для меня, выглядит как ini-файл. PHP имеет [функцию 'parse_ini_file'] (http://php.net/manual/en/function.parse-ini-file.php), которая возвращает массив. Используйте это, отредактируйте, что нужно для редактирования и использования этих данных (чтобы написать новый ini-файл или что-то еще) –

ответ

7

Вам нужно что-то под названием PCRE Lookaround Assertions, а точнее: положительный lookahead (?=suffix) и lookbehind (?<=prefix). Это означает, что вы можете сопоставлять префиксы и суффиксы без их захвата, поэтому они не будут потеряны во время соответствия регулярному выражению &.

Ваш код, используя те:

$licenseKey = 'newLicenseKey'; 
$configFileContent = file_get_contents(configFile.ini); 
$configFileContent = preg_replace('/(?<=code = ")(.*)(?=")/', $licenseKey, $configFileContent); 
+0

Спасибо человеку! это сделало трюк для меня! – Lumix1991

+0

Я бы, вероятно, добавил некоторые исключения в проверку, чтобы убедиться, что скрипт не уязвим для атаки. Должен исключить «и линейные разломы как минимум». – Wobbles

+0

nit-pick: _PREG assertions_ - это нечетный термин: PREG является префиксом для всех функций PCRE (Perl Compatible Regular Expression). То, что вы имеете в виду, это поисковые запросы –

1

Как я уже сказал в своем комментарии, я бы решить эту проблему путем обработки файла как то, что это файл INI.

  1. Разбираем файл
  2. значения обновления, которые необходимо изменить
  3. перезаписать файл или сделать что-то еще (в зависимости от ваших потребностей)

Я предполагаю, что вы хотите обновить файл , так что в этом примере я перезаписать:

$iniData = parse_ini_file('configFile.ini', true);//quote the filename 
foreach ($iniData as $section => $params) { 
    if (isset($params['code'])) { 
     $params['code'] = $newCode; 
     $iniData[$section] = $params;//update section 
    } 
} 
//write to new file 
$lines = [];//array of lines 
foreach ($iniData as $section => $params) { 
    $lines[] = sprintf('[%s]', $section); 
    foreach ($params as $k => $v) { 
     $lines[] = sprintf('%s = "%s"); 
    } 
} 
file_put_contents('configFile.ini', implode(PHP_EOL, $lines)); 

Вы можете комбинировать оба петли довольно легко, чтобы упростить код:

$lines = []; 
foreach ($iniData as $section => $params) { 
    if (isset($params['code'])) { 
     $params['code'] = $newCode; 
    } 
    $lines[] = sprintf('[%s]', $section); 
    foreach ($params as $k => $v) { 
     $lines[] = sprintf('%s = "%s"); 
    } 
} 
+0

Хотя мой ответ - ответ на то, что хочет OP, это ответ на то, что OP _needs_. Поэтому: +1. – klaar

+0

Спасибо, это даже лучшее решение !. – Lumix1991

+0

@ Lumix1991 : Благодарим вас за помощь. Пожалуйста, [подумайте о принятии ответа] (http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work), в зависимости от того, какой ответ наилучшим образом ответил на ваш вопрос/был наиболее полезен или предоставляет наилучшую информацию для будущей справки (то есть других людей, у которых может быть один и тот же вопрос) –

Смежные вопросы