[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Ошибка при parse_ini_file
Let4ik_Russia
День добрый. проблема состоит в том чтобы написать функции для чтения и записи ини файла одной программы, но в ключах содержатся "()" так что parse_ini_file не подходит, нашел функцию которая парсит файл:
function parse_ini ( $filepath ) {
$ini = file( $filepath );
if ( count( $ini ) == 0 ) { return array(); }
$sections = array();
$values = array();
$globals = array();
$i = 0;
foreach( $ini as $line ){
$line = trim( $line );
// Comments
if ( $line == '' || $line{0} == ';' ) { continue; }
// Sections
if ( $line{0} == '[' ) {
$sections[] = substr( $line, 1, -1 );
$i++;
continue;
}
// Key-value pair
list( $key, $value ) = explode( '=', $line, 2 );
$key = trim( $key );
$value = trim( $value );
if ( $i == 0 ) {
// Array values
if ( substr( $line, -1, 2 ) == '[]' ) {
$globals[ $key ][] = $value;
} else {
$globals[ $key ] = $value;
}
}
else {
// Array values
if ( substr( $line, -1, 2 ) == '[]' ) {
$values[ $i - 1 ][ $key ][] = $value;
} else {
$values[ $i - 1 ][ $key ] = $value;
}
}
}

for( $j=0; $j<$i; $j++ ) {
$result[ $sections[ $j ] ] = $values[ $j ];
}
return $result + $globals;
}


помогите с остальными функциями для чтения и записи ини файла ну чтобы примерно синтаксис использования был таков:


ini_read("section", "key"); //для чтения
ini_write("section", "key", $value); //для записи






Спустя 1 час, 44 минуты, 10 секунд (10.04.2011 - 10:14) T1grOK написал(а):
Версия php какая? Потому как в 5.3.1, есть специальный механизм для работы с ini файлами.

Спустя 3 минуты, 36 секунд (10.04.2011 - 10:18) Let4ik_Russia написал(а):
Цитата (T1grOK @ 10.04.2011 - 07:14)
Версия php какая? Потому как в 5.3.1, есть специальный механизм для работы с ini файлами.

Что за механизм можно поподробнее??? PHP Version 5.2.4

Спустя 6 часов, 53 минуты, 13 секунд (10.04.2011 - 17:11) Let4ik_Russia написал(а):
Ну будьте человеками, помогите...парюсь уже неделю с этим вопросом!

Спустя 18 минут, 48 секунд (10.04.2011 - 17:30) Raito-kun написал(а):
можно поподробней насчет
Цитата
parse_ini_file не подходит
?

parse_ini_file отлично подходит для работы с ini файлами.
чтение производится через ключи получившегося массива, запись этой функцией:
function write_ini_file($path, $assoc_arr) { 
$content = "";

foreach ($assoc_arr as $key=>$elem) {
if (is_array($elem)) {
if ($key != '') {
$content .= "[".$key."]\r\n";
}

foreach ($elem as $key2=>$elem2) {
if ($this->beginsWith($key2,'Comment_') == 1 && $this->beginsWith($elem2,';')) {
$content .= $elem2."\r\n";
}
else if ($this->beginsWith($key2,'Newline_') == 1 && ($elem2 == '')) {
$content .= $elem2."\r\n";
}
else {
$content .= $key2." = ".$elem2."\r\n";
}
}
}

else {
$content .= $key." = ".$elem."\r\n";
}
}


if (!$handle = fopen($path, 'w')) {
return -2;
}
if (!fwrite($handle, $content)) {
return -2;
}
fclose($handle);
return 1;
}

я бы не использовал кустарные функции, когда есть хороший стандартный инструмент из php.net

Спустя 19 минут (10.04.2011 - 17:49) Let4ik_Russia написал(а):
Цитата (Raito-kun @ 10.04.2011 - 14:30)
можно поподробней насчет 
Цитата
parse_ini_file не подходит
?

parse_ini_file отлично подходит для работы с ini файлами.

как я писал выше в конфиг файле в ключах присутствую "()" скобки parse_ini_file, к сожалению, не воспринимает этого из-за чего и получается ошибка при чтении и записи файла, а изменить этот ключ я не могу так как он используется не только моим приложением...

Спустя 6 минут, 5 секунд (10.04.2011 - 17:55) Raito-kun написал(а):
я не понимаю, специально протестил сейчас запись и чтение такого конфига:
[SomeIniFile]
(One) = (one)
Two = two

все отлично считалось и записалось.
кинь кусок в котором по твоему мнению возникает ошибка, переименуй, я попробую.

Спустя 7 минут, 7 секунд (10.04.2011 - 18:02) Let4ik_Russia написал(а):
Цитата (Raito-kun @ 10.04.2011 - 14:55)
я не понимаю, специально протестил сейчас запись и чтение такого конфига:
[SomeIniFile]
(One) = (one)
Two = two

все отлично считалось и записалось

ты считывал функцией parse_ini_file? а какая версия php у тебя?
вот кусок файла на котором происходит ошибка чтения
Lease (minutes)=2880

Спустя 3 минуты, 59 секунд (10.04.2011 - 18:06) Raito-kun написал(а):
да. версия 5.2.10. да тут не в версии дело, если у тебя есть поддержка этой функции.
у тебя секции в ini-файле присутствуют? не забываешь ставить второй аргумент true?

Спустя 1 минута, 4 секунды (10.04.2011 - 18:07) Raito-kun написал(а):
нет, все-таки у меня проблем не возникло

Спустя 1 минута, 29 секунд (10.04.2011 - 18:08) Let4ik_Russia написал(а):
Цитата (Raito-kun @ 10.04.2011 - 15:06)
да. версия 5.2.10. да тут не в версии дело, если у тебя есть поддержка этой функции.
у тебя секции в ini-файле присутствуют? не забываешь ставить второй аргумент  true?

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

Нет дело не в пробеле, только что специально проверил, убрал скобки , пробел оставил...все нормально...ставлю скобки появляется ошибка

Спустя 3 минуты, 14 секунд (10.04.2011 - 18:12) Let4ik_Russia написал(а):
Цитата (Raito-kun @ 10.04.2011 - 15:07)
нет, все-таки у меня проблем не возникло

покажи плиз функции...возможно это решит проблему мою))

Спустя 1 минута, 42 секунды (10.04.2011 - 18:13) Raito-kun написал(а):

$ini = parse_ini_file("1.ini", true);

$config = array("FirstSection" =>
array("O (ne)" => 'one',
"Two" => 'two')
);


write_ini_file("1.ini", $config);

function write_ini_file($path, $assoc_arr) {
$content = "";
foreach ($assoc_arr as $key=>$elem) {
if (is_array($elem)) {
if ($key != '') {
$content .= "[".$key."]\r\n";
}
foreach ($elem as $key2=>$elem2) {
if (my_str_begins_with($key2,'Comment_') == 1 && my_str_begins_with($elem2,';')) {
$content .= $elem2."\r\n";
}
else if (my_str_begins_with($key2,'Newline_') == 1 && ($elem2 == '')) {
$content .= $elem2."\r\n";
}
else {
$content .= $key2." = ".$elem2."\r\n";
}
}
}

else {
$content .= $key." = ".$elem."\r\n";
}
}

if (!$handle = fopen($path, 'w')) {
return false;
}
if (!fwrite($handle, $content)) {
return false;
}
fclose($handle);
return true;
}
function my_str_begins_with($str, $sub) {
return ( substr( $str, 0, strlen( $sub ) ) === $sub );
}

подправил.

Спустя 7 минут, 20 секунд (10.04.2011 - 18:21) Let4ik_Russia написал(а):
Цитата (Raito-kun @ 10.04.2011 - 15:13)


function my_str_begins_with($str, $sub) {
return ( substr( $str, 0, strlen( $sub ) ) === $sub );
}

а это что за функция?))

Спустя 1 минута, 43 секунды (10.04.2011 - 18:22) Raito-kun написал(а):
действительно варнинг возникает, но не мешает работе. почему - не знаю. поставь
@parse_ini_file
пока не найдем причину. или проигнорь, если проблем не возникает.

Спустя 2 минуты, 36 секунд (10.04.2011 - 18:25) Let4ik_Russia написал(а):
Цитата (Raito-kun @ 10.04.2011 - 15:22)
действительно варнинг возникает, но не мешает работе. почему - не знаю. поставь
@parse_ini_file
пока не найдем причину. или проигнорь, если проблем не возникает.

дак вот я использую PHP Devel Studio, так что ошибка мне очень мешает...

Спустя 8 минут, 36 секунд (10.04.2011 - 18:34) Raito-kun написал(а):
Цитата
а это что за функция?))

это для того, чтобы правильно вставлять комменты и новые строки. вот так попробуй:
$config = array("FirstSection" =>
array("O (ne)" => 'one',
"Comment_" => ';somecomment',
"Newline_" => '',
"Two" => 'two')
);

Спустя 6 минут, 42 секунды (10.04.2011 - 18:40) Let4ik_Russia написал(а):
Работает!)) но warning при чтении остается((

Спустя 3 минуты, 21 секунда (10.04.2011 - 18:44) Raito-kun написал(а):
в общем записывает функция верно. не считывает и ругается правильно, т.к. скобочек действительно не должно быть... надо думать.
варнинг убирается собачкой перед вызовом функции, другое дело что ты не сможешь считать информацию.

Спустя 3 минуты, 10 секунд (10.04.2011 - 18:47) Let4ik_Russia написал(а):
Цитата (Raito-kun @ 10.04.2011 - 15:44)
в общем записывает функция верно. не считывает и ругается правильно, т.к. скобочек действительно не должно быть... надо думать.

это уже 4-й форум на который я пишу, на остальных говорят писать свои функции...

Спустя 9 минут, 24 секунды (10.04.2011 - 18:56) Raito-kun написал(а):
лови. работает для твоего случая.
function read_ini_file($f, &$r) 
{
$null = "";
$r=$null;
$first_char = "";
$sec=$null;
$comment_chars=";#";
$num_comments = "0";
$num_newline = "0";

//Read to end of file with the newlines still attached into $f
$f = @file($f);
if ($f === false) {
return -2;
}
// Process all lines from 0 to count($f)
for ($i=0; $i<@count($f); $i++)
{
$w=@trim($f[$i]);
$first_char = @substr($w,0,1);
if ($w)
{
if ((@substr($w,0,1)=="[") and (@substr($w,-1,1))=="]") {
$sec=@substr($w,1,@strlen($w)-2);
$num_comments = 0;
$num_newline = 0;
}
else if ((stristr($comment_chars, $first_char) == true)) {
$r[$sec]["Comment_".$num_comments]=$w;
$num_comments = $num_comments +1;
}
else {
// Look for the = char to allow us to split the section into key and value
$w=@explode("=",$w);
$k=@trim($w[0]);
unset($w[0]);
$v=@trim(@implode("=",$w));
// look for the new lines
if ((@substr($v,0,1)=="\"") and (@substr($v,-1,1)=="\"")) {
$v=@substr($v,1,@strlen($v)-2);
}

$r[$sec][$k]=$v;

}
}

else {
$r[$sec]["Newline_".$num_newline]=$w;
$num_newline = $num_newline +1;
}
}

return 1;
}

Спустя 1 минута, 42 секунды (10.04.2011 - 18:58) Let4ik_Russia написал(а):
Цитата (Raito-kun @ 10.04.2011 - 15:44)
варнинг убирается собачкой перед вызовом функции, другое дело что ты не сможешь считать информацию.

Воспользовался функцией из 1-го топика для открытия, все прошло чисто без ошибок и чтение и запись и перезапись! вроде пока что полет нормальный!!!)))

Спустя 1 минута, 46 секунд (10.04.2011 - 19:00) Raito-kun написал(а):
вот тебе полный комплект функций. this уберешь, если не выкладываешь это в отдельный класс.
function read_ini_file($f, &$r) 
{
$null = "";
$r=$null;
$first_char = "";
$sec=$null;
$comment_chars=";#";
$num_comments = "0";
$num_newline = "0";

//Read to end of file with the newlines still attached into $f
$f = @file($f);
if ($f === false) {
return -2;
}
// Process all lines from 0 to count($f)
for ($i=0; $i<@count($f); $i++)
{
$w=@trim($f[$i]);
$first_char = @substr($w,0,1);
if ($w)
{
if ((@substr($w,0,1)=="[") and (@substr($w,-1,1))=="]") {
$sec=@substr($w,1,@strlen($w)-2);
$num_comments = 0;
$num_newline = 0;
}
else if ((stristr($comment_chars, $first_char) == true)) {
$r[$sec]["Comment_".$num_comments]=$w;
$num_comments = $num_comments +1;
}
else {
// Look for the = char to allow us to split the section into key and value
$w=@explode("=",$w);
$k=@trim($w[0]);
unset($w[0]);
$v=@trim(@implode("=",$w));
// look for the new lines
if ((@substr($v,0,1)=="\"") and (@substr($v,-1,1)=="\"")) {
$v=@substr($v,1,@strlen($v)-2);
}

$r[$sec][$k]=$v;

}
}

else {
$r[$sec]["Newline_".$num_newline]=$w;
$num_newline = $num_newline +1;
}
}

return 1;
}

function write_ini_file($path, $assoc_arr) {
$content = "";

foreach ($assoc_arr as $key=>$elem) {
if (is_array($elem)) {
if ($key != '') {
$content .= "[".$key."]\r\n";
}

foreach ($elem as $key2=>$elem2) {
if ($this->beginsWith($key2,'Comment_') == 1 && $this->beginsWith($elem2,';')) {
$content .= $elem2."\r\n";
}
else if ($this->beginsWith($key2,'Newline_') == 1 && ($elem2 == '')) {
$content .= $elem2."\r\n";
}
else {
$content .= $key2." = ".$elem2."\r\n";
}
}
}

else {
$content .= $key." = ".$elem."\r\n";
}
}


if (!$handle = fopen($path, 'w')) {
return -2;
}
if (!fwrite($handle, $content)) {
return -2;
}
fclose($handle);
return 1;
}

function beginsWith( $str, $sub ) {
return ( substr( $str, 0, strlen( $sub ) ) === $sub );
}

Спустя 1 минута, 7 секунд (10.04.2011 - 19:01) Let4ik_Russia написал(а):
Спасибо тебе большое за помощь)) искренне благодарен...
теперь еще остается вопрос как считать конкретый ключ из нужной секции и поместить его значение в переменную)))

Спустя 5 минут, 13 секунд (10.04.2011 - 19:06) Raito-kun написал(а):
read_ini_file("1.ini", $result);
$somevar = $result["FirstSection"]["O (ne)"];
echo $somevar;

Спустя 4 минуты, 20 секунд (10.04.2011 - 19:10) Let4ik_Russia написал(а):
Ваше спасибо тебе!!!!! Эт просто для меня неоценимо)))

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

Спустя 1 час, 15 минут, 43 секунды (10.04.2011 - 20:26) Raito-kun написал(а):
ну для этого нужно пройти по всем ключам и заменить на свой нужный:
$read_completed = read_ini_file("1.ini", $a);

$new_array = array();
if($read_completed) {
foreach($a as $section_key => $section_value) {
foreach($section_value as $param_key => $param_value) {
if($param_key == "o (ne)") {
$new_array[$section_key]["new key"] = $param_value;
continue;
}
$new_array[$section_key][$param_key] = $param_value;
}
}
}


write_ini_file('1.ini', $new_array);

Спустя 10 часов, 9 минут, 59 секунд (11.04.2011 - 06:36) Let4ik_Russia написал(а):
Цитата (Raito-kun @ 10.04.2011 - 17:26)
ну для этого нужно пройти по всем ключам и заменить на свой нужный:
$read_completed = read_ini_file("1.ini", $a);

$new_array = array();
if($read_completed) {
foreach($a as $section_key => $section_value) {
  foreach($section_value as $param_key => $param_value) {
  if($param_key == "o (ne)") {
    $new_array[$section_key]["new key"] = $param_value;
    continue;
  }
  $new_array[$section_key][$param_key] = $param_value;
  }
}
}


write_ini_file('1.ini', $new_array);

После этих действий получается что перезаписывается сам ключ а не его значение

Спустя 41 минута, 55 секунд (11.04.2011 - 07:18) Let4ik_Russia написал(а):
Вот файл который нужно редактировать, это файл программы TFTPD32:
[DHCP]
Lease_NumLeases=0
IP_Pool=167815360
PoolSize=10
BootFile=pxelinux.0
DNS=-2103412524
Mask=16777215
Gateway=0
DomainName=
Lease (minutes)=2880
AddOptionNumber1=0
AddOptionValue1=
AddOptionNumber2=0
AddOptionValue2=
AddOptionNumber3=0
AddOptionValue3=
AddOptionNumber4=0
AddOptionValue4=
AddOptionNumber5=0
AddOptionValue5=
AddOptionNumber6=0
AddOptionValue6=
AddOptionNumber7=0
AddOptionValue7=
AddOptionNumber8=0
AddOptionValue8=
AddOptionNumber9=0
AddOptionValue9=
AddOptionNumber10=0
AddOptionValue10=
[TFTPD32]
BaseDirectory=D:\NETBoot
TftpPort=69
Hide=0
WinSize=1492
Negociate=1
PXECompatibility=0
DirText=0
ShowProgressBar=1
Timeout=3
MaxRetransmit=6
SecurityLevel=0
UnixStrings=1
Beep=0
VirtualRoot=1
MD5=0
LocalIP=
Services=5
TftpLogFile=
SaveSyslogFile=
PipeSyslogMsg=0
LowestUDPPort=0
HighestUDPPort=0
MulticastPort=0
MulticastAddress=
PersistantLeases=1
DHCP Ping=1
DHCP LocalIP=
Max Simultaneous Transfers=100
UseEventLog=0
Console Password=tftpd32
Support for port Option=0
Keep transfer Gui=5
Ignore ack for last TFTP packet=0

Каждый ключ в нем обязателен, а его значения будут редактироваться с помощью полей для ввода, в которые я просто ввожу нужные значения нажимаю "ОК" и оно записывается в файл, но некоторые ключи нужно оставить без возможности редактирования, т.е. чтоб как они были так они и остались...Пользуюсь вот этой программой PHP Devel Studio это аля PHP for Delphi, вот как там реализована Работа с файлами INI в PHP, может легче этот скрипт поправить?

Спустя 5 часов, 26 минут, 48 секунд (11.04.2011 - 12:45) Raito-kun написал(а):
так ты же и писал, что тебе нужно подправить один ключ. а подправить 1 значение еще намного легче.
$read_completed = read_ini_file("1.ini", $result);
if($read_completed) {
$result['FirstSection']['key'] = 'new value';
}
write_ini_file('1.ini', $result);

собственно я написал тебе как править любой ключ и значение. можешь вынести это в функции и будет тебе полноценный инструмент для работы с ини файлами.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.