Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> парсер ini файла 
:(
    Опции темы
Sniper
Дата 11.8.2008, 16:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 511
Регистрация: 8.5.2002

Репутация: нет
Всего: 2



пытаюсь осилить написание собственного велоси^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

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

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

Это сообщение отредактировал(а) Sniper - 11.8.2008, 16:48


--------------------
"Я испытываю отвращение к системе, разработаннной для "пользователя", если в слове "пользователь" закодировано уничижительное значение "тупой и примитивный".
Кен Томпсон, создатель Unix
PM MAIL   Вверх
Feldmarschall
Дата 11.8.2008, 16:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
****


Профиль
Группа: Участник
Сообщений: 2641
Регистрация: 11.12.2007

Репутация: 22
Всего: 32



ты в курсе, что в пхп есть встроенная функция для этого?
что значит "ожидаю что в  $section окажется: sect1 sect2 sect3"? В скалярной переменной может быть только одно значение, а не три.
почему не пишешь, что именно "в  $section оказывается"? 
PM   Вверх
Sniper
Дата 11.8.2008, 17:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 511
Регистрация: 8.5.2002

Репутация: нет
Всего: 2



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

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

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



Это сообщение отредактировал(а) Sniper - 11.8.2008, 17:43


--------------------
"Я испытываю отвращение к системе, разработаннной для "пользователя", если в слове "пользователь" закодировано уничижительное значение "тупой и примитивный".
Кен Томпсон, создатель Unix
PM MAIL   Вверх
ksnk
Дата 11.8.2008, 17:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



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


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
mr.Anderson
Дата 11.8.2008, 17:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


iOS Lead Developer
****


Профиль
Группа: Участник Клуба
Сообщений: 3374
Регистрация: 20.12.2004
Где: далеко

Репутация: 1
Всего: 128



Sniper, я в свое время писал подобную вещь... Попробую нарыть что-нибудь...

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

Присоединённый файл ( Кол-во скачиваний: 8 )
Присоединённый файл  TIniFile.php 3,44 Kb


--------------------
user posted image

user posted image
PM MAIL ICQ Skype   Вверх
Sniper
Дата 11.8.2008, 17:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 511
Регистрация: 8.5.2002

Репутация: нет
Всего: 2



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



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

<?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 ] =>
        )

)



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

Это сообщение отредактировал(а) Sniper - 11.8.2008, 17:53


--------------------
"Я испытываю отвращение к системе, разработаннной для "пользователя", если в слове "пользователь" закодировано уничижительное значение "тупой и примитивный".
Кен Томпсон, создатель Unix
PM MAIL   Вверх
piflit
Дата 11.8.2008, 18:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 2.9.2007

Репутация: нет
Всего: нет



Sniper

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

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

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

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

Это сообщение отредактировал(а) piflit - 11.8.2008, 18:13
PM MAIL   Вверх
bobik02
Дата 11.8.2008, 18:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 451
Регистрация: 26.11.2007

Репутация: 2
Всего: 14



Все же(если не секрет) чем не устроила ? - parse_ini_file


--------------------
Have a nice day
PM   Вверх
Sannis
Дата 11.8.2008, 19:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 375
Регистрация: 14.8.2007
Где: Москва

Репутация: 6
Всего: 13



Цитата(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 );



--------------------
Я Критик Джим, раньше писал моды для IPB 1.3.x-2.3.x, а теперь продвигаю Node.js в массы.
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0607 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.