Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > парсер ini файла


Автор: Sniper 11.8.2008, 16:44
пытаюсь осилить написание собственного велоси^W функции парсинга ini файла

Код

;-- comment

[sect1]
keykey = myvalue;
[sect2]
somekey = somevalue;
[sect3]
somevar = 



код:

Код

<?php
  $section = "";

  $r = fopen( "testfile.ini", "r" );
  while ( $line = fgets( $r ) ) {
    if ( $line[0] == ';' ) { //комментарии пропускаем
    }
     else if ( $line[0] == '[' ) { //нашли скобку, значит это секция
//            и вот тут затык почему-то
            $section = substr( $line, 1,-1 );
/* ожидаю что в  $section окажется:
sect1
sect2
sect3

, а не тут-то было ;-(
*/
          }
  }
?>

как исправить?

Автор: Feldmarschall 11.8.2008, 16:53
ты в курсе, что в пхп есть встроенная функция для этого?
что значит "ожидаю что в  $section окажется: sect1 sect2 sect3"? В скалярной переменной может быть только одно значение, а не три.
почему не пишешь, что именно "в  $section оказывается"? 

Автор: Sniper 11.8.2008, 17:35
Цитата(Feldmarschall @  11.8.2008,  13:53 Найти цитируемый пост)
ты в курсе, что в пхп есть встроенная функция для этого?

разумеется, я ж написал "... пытаюсь осилить написание собственного велоси^W функции" smile

в section оказывается sect1]
но так как там цикл то выводится на печать соответственно sect1]sect2]sect3]


Автор: ksnk 11.8.2008, 17:39
Sniper, А проверить последнюю букву в строке отладчик не разрешает? Вдруг там пробел или \r?

Автор: mr.Anderson 11.8.2008, 17:39
Sniper, я в свое время писал подобную вещь... Попробую нарыть что-нибудь...

Добавлено через 38 секунд
Вот, держи. Сделан по аналогии с дельфовым классом, я воткнул туда самое необходимое.

Автор: Sniper 11.8.2008, 17:51
эх спасибо, но у меня готово практически, осталось вот с этой штукой разобраться:



Вот что я сделал, но оно плохо функционирует...
Код

<?php
  $section = "";

  $r = fopen( "testfile.ini", "r" );
  while ( $line = fgets( $r ) ) {
    if ( $line[0] == ';' ) {
    }
     else if ( $line[0] == '[' ) {
            $section = substr( $line, 1,-1 );
            print $section;
          } else {
            $delimiter = strpos($line, '=');
             if ($delimiter > 0) { // есть =, значит это пара ключ/значение
               $key = strtolower( substr( $line, 0, $delimiter ) );
               $value = substr( $line, $delimiter + 1 ) ;
               $result_array[ $section ][$key] = $value;
             }
          }
  }
print_r ($result_array);
?>

помогите вот это доделать чтоб работало.

Результат сейчас вот такой

Код

Array
(
    [sect1]] => Array
        (
            [keykey ] =>  myvalue;

        )

    [sect2]] => Array
        (
            [somekey ] =>  somevalue;

        )

    [sect3]] => Array
        (
            [somevar ] =>
        )

)



вот эту дурацкую вторую скобку ] в каждой секции  и пробел в имени ключа не могу победить

Автор: piflit 11.8.2008, 18:01
Sniper

можно распарсить регулярками

сначала /\[([^\]]+)\]/ => sect_array
потом 
foreach( $sect_array as $val ) {
    /\[$val\]\s+(\w+)/s => key_val
    /\[$val\]\s+\w+ = ([^;]+);/s => value_val
}

в любой момент можно сделать array_push или сохранять во временный файл или другим образом запоминать полученные результаты

ЗЫ но лучше юзать готовые функции  smile

Автор: bobik02 11.8.2008, 18:04
Все же(если не секрет) чем не устроила ? - http://ua2.php.net/manual/ru/function.parse-ini-file.php

Автор: Sannis 11.8.2008, 19:15
Цитата(bobik02 @  11.8.2008,  18:04 Найти цитируемый пост)
Все же(если не секрет) чем не устроила ? - parse_ini_file

Тем, что вы невниметельно прочитали пост ТС smile
Цитата(Sniper @  11.8.2008,  17:51 Найти цитируемый пост)
вот эту дурацкую вторую скобку ] в каждой секции  и пробел в имени ключа не могу победить

Хм, вам же ответили:
Цитата(ksnk @  11.8.2008,  17:39 Найти цитируемый пост)
Sniper, А проверить последнюю букву в строке отладчик не разрешает? Вдруг там пробел или \r? 

Например, можно убрать пробелы с помощью trim():
Код

$section = substr( trim($line), 1,-1 );

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)