Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум Регулярные Выражения

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Помогите составить регулярное выражение для разборки ini файла
 
 автор: pini-pini   (13.07.2006 в 11:32)   письмо автору
 
 

Помогите составить регулярное выражение для разборки ini файла.
Примерный формат файла:

[test0]
var0 = "val0";
var1 = "val1";
var2 = "val2";
var3 = "val3";

[test1]
var0 = "val0";
var1 = "val1";
var2 = "val2";
var3 = "val3";


Нужно учитывать, что там могут быть комментакии слебующих типов:
// комментакий
# комментакий
/* комментакий */

На выходе должен появиться массив такого вида:

Array
(
    [test0] => Array
        (
            [var0] => val0
            [var1] => val1
            [var2] => val2
            [var3] => val3
        )

    [test1] => Array
        (
            [var0] => val0
            [var1] => val1
            [var2] => val2
            [var3] => val3
        )

)

   
 
 автор: pini-pini   (15.07.2006 в 17:12)   письмо автору
 
   для: pini-pini   (13.07.2006 в 11:32)
 

up

   
 
 автор: WebTech   (15.07.2006 в 19:48)   письмо автору
 
   для: pini-pini   (15.07.2006 в 17:12)
 

Написал в виде функции. В качестве аргумента принимается имя файла. Результат работы функции - массив по описанной вами схеме. Комменты игнорируются.


<?php
function ini_parse($file)
{
// считываем построчно файл ini 
$ini file($file);
// парсим
foreach($ini as $line)
{
// ищем название блока ( [test0] )
$ln preg_match('%\[(.*)\]%'$line$matches);
if (
$ln)
  {
  
$tag $matches[1];
  }
// ищем переменную и ее значение
$ln preg_match('%([a-z0-9]+)\s*=\s*"(.*)";%'$line$matches);
if (
$ln)
  {
  
// записываем в массив
  
$ini_arr[$tag][$matches[1]] = $matches[2];
  }
}
return 
$ini_arr;
}
?>

   
 
 автор: cheops   (15.07.2006 в 19:03)   письмо автору
 
   для: pini-pini   (13.07.2006 в 11:32)
 

Можно конечно поступить так,
<?php
  $text 
'[test0] 
var0 = "val0"; 
var1 = "val1"; 
var2 = "val2"; 
var3 = "val3"; 

[test1] 
var0 = "val0"; 
var1 = "val1"; 
var2 = "val2"; 
var3 = "val3";'
;
  
$pattern "|\[([^\]]+)\][\s]+([^\[]+)|is";
  
preg_match_all($pattern$text$out);
  for(
$i 0$i count($out); $i++)
  {
    if(!empty(
$out[1][$i]))
    {
      
$pattern "|([\w\d]+)[\s]*=[\s]*\"([\w\d]+)\";|is";
      
preg_match_all($pattern$out[2][$i], $var);
      for(
$j 0$j count($var); $j++)
      
$result[$out[1][$i]][$var[1][$j]] = $var[2][$j];
    }
  }
  echo 
"<pre>";
  
print_r($result);
  echo 
"</pre>";
?>

но вообще это будет изобретением велосипеда, так как в PHP существует стандартная фунция parse_ini_file(), для разбора ini-файлов.

   
 
 автор: pini-pini   (15.07.2006 в 19:43)   письмо автору
 
   для: cheops   (15.07.2006 в 19:03)
 

Спасибо!
Огромное спасибо!
Работает.

PS: на счёт изобретения велосипеда: я делаю свою небольшую платформенно и function'но независимую библиотечку для работы с ini файлами

   
 
 автор: pini-pini   (15.07.2006 в 19:58)   письмо автору
 
   для: pini-pini   (13.07.2006 в 11:32)
 

Код WebTech более подходит.
У cheops'а обрезаються парметры.
Спасибо.

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования