Регулярные выражения!!!

Valdisss

Guest
Регулярные выражения!!!

Помогите с составлянием регулярного выражения и поиском элемента строки.

Есть файл, в нём записаны такие строки:
Просто текст
КОнстанты:

[DBHOST]=localhost;
[DBPORT]=3306;
[DBLOG]=root;
[DBPASS]=root;

Нужно вычленить из этого файла константы и их значения.

Файл считывается функцией file() в массив.
После этого пробегаем по массиву и вычленяем строки в которых содержаться описание констант.

PHP:
$result=file("constant.php");

foreach ($result as $value)
{
 preg_match_all("/[[A-Z][A-Z0-9]{1,20}]=[a-zA-Z0-9а-яА-Я]*;/",$value, $result);
}
print_r($result);
Скажите правильно ли составлено выражение?

Выводиться только последняя константа, как сделать, чтобы вывелись все?
 

AHTIXPICT

Новичок
здесь больше подойдет
explode()
str_replace()
Хотя зачем это нужно вообще не понятно

require_once() никто не отменял
 

hussar

In code we trust!
Вот так

PHP:
preg_match_all("/\[[a-z0-9]{1,20}\]=[a-z0-9а-я]*;/i",$value, $matches);
И прочитай про функцию parse_ini_file(), мне кажется она тебе поможет
 

Valdisss

Guest
Конечно можно сделать так:
PHP:
<?php
define("DBHOST","localhost");
?>
Но задача стоит именно так чтобы распознавать по-такому принципу.
Попробовал explode:
PHP:
$result=file("constant.php");
foreach ($result as $value)
{
	explode("/[[A-Z][A-Z0-9]{1,20}]=[a-zA-Z0-9а-яА-Я]*;/",$value,$result)	;
}
print_r($result);
Вот результат:
Array ( [0] => 1) Константа хост подключения к базе данных: [1] => [2] => [DBHOST]=localhost; [3] => [DBPORT]=3306; [4] => [DBLOG]=root; [5] => [DBPASS]=nopass; [6] => [DBNAME]=dvtest; )

-~{}~ 28.04.06 14:08:

Автор оригинала: hussar
Вот так

PHP:
preg_match_all("/\[[a-z0-9]{1,20}\]=[a-z0-9а-я]*;/i",$value, $matches);
И прочитай про функцию parse_ini_file(), мне кажется она тебе поможет
Про функцию спасибо, сейчас почитаю.
Не понял зачем экранировать символ "[" ?
 

hussar

In code we trust!
Да согласен, и так работает! Пока не знаю, сейчас поискать надо информацию.
 

Valdisss

Guest
По поводу parse_ini_file - спасибо, действительно полезная функция и решает мою проблему.

Но хотелось бы узнать какие есть ещё способы?

-~{}~ 28.04.06 14:28:

А точнее, если можете, поясните работу preg_match_all
 

hussar

In code we trust!
А что тебе конкретно не понятно в preg_match_all?

Насчет экранирования [], тут дело скорее всего в том, что если не экранировать, то они как бы окажутся внутри квадратных скобок, т.е. внуртри символьного класса, и будут восприниматься как они есть. А если мы их заэкранируем, то они окажутся снаружи а внутри их уже будет символьный класс из одних букв.

Оба варианта нас в данном случае устраивают!
 

Valdisss

Guest
Всё спасибо, тему думаю можно закрывать. Решение найдено.

1) использовать parse_ini_file
Оказалось проще всего.

2) Файл с описанием констант содержал следующий текст:
1) Константа хост подключения к базе данных:

[DBHOST]=localhost;
[DBPORT]=3306;
[DBLOG]=root;
[DBPASS]=nopass;
[DBNAME]=dvtest;
dasdassad
sadasdsad
asdasd;,ksdal;
asdlmsad;lsad;lsm,a
sadlsad;asd;lsd

А вот код который вывел массив определённых констант:
PHP:
<?php
$result=file("constant.php");
$result1="";
foreach ($result as $value)
{
	$result1.=$value;
}
preg_match_all("/\[[a-z0-9]{1,20}\]=[a-z0-9а-я]*;/i",$result1, $result2);
print_r($result2);
?>
В итоге я получил:
Array ( [0] => Array ( [0] => [DBHOST]=localhost; [1] => [DBPORT]=3306; [2] => [DBLOG]=root; [3] => [DBPASS]=nopass; [4] => [DBNAME]=dvtest; ) )

Спасибо всем за помощь.
 

Valdisss

Guest
Автор оригинала: SID
Valdisss
нужно делать не как
а делать правельно.

а как делать правельно написал AHTIXPICT в первом посте ;)
Бывают ситуации, когда нужно сделать именно так. И в этом случае проще использовать parse_ini_file
 

.des.

Поставил пиво кому надо ;-)
Автор оригинала: SID
Valdisss
нужно делать не как
а делать правельно.

а как делать правельно написал AHTIXPICT в первом посте ;)
городить кучу кода вместо вызова функции специально созданной для работы с файлами такой структуры... это по Вашему правильно?
Давайте не будем советовать столь сомнительные утверждения.
 

Valdisss

Guest
Но всё равно спасибо за советы, explode кстати не работает!
 

.des.

Поставил пиво кому надо ;-)
не работает, потому что неправильно применяете :)
PHP:
$result=file("constant.php"); 
foreach ($result as $line)  { 
    $t = explode("=",$line); 
    $constant_name = trim($t[0],"[] \t");
    $constant_value = isset($t[1])?trim($t[1]):null;
    echo  $constant_name." ".$constant_value."\n";
}
 

Andreika

"PHP for nubies" reader
.des.
городить кучу кода вместо вызова функции специально созданной для работы с файлами такой структуры
parse_ini_file ? у ини файла структура
[section]
param = value

а уж никак не [param]=value;
и если оно работает как надо, то это скорее чудо
 

Valdisss

Guest
Автор оригинала: .des.
городить кучу кода вместо вызова функции специально созданной для работы с файлами такой структуры... это по Вашему правильно?
Давайте не будем советовать столь сомнительные утверждения.
des поддерживаю!
;)

-~{}~ 28.04.06 15:20:

Автор оригинала: Andreika
.des.
городить кучу кода вместо вызова функции специально созданной для работы с файлами такой структуры
parse_ini_file ? у ини файла структура
[section]
param = value

а уж никак не [param]=value;
и если оно работает как надо, то это скорее чудо
А с чего ты взял что структура у меня должна быть такой.
Меня вот полностью устроила функция parse_ini_file

Мне был интересен другой подход к определению констант нежели давать юзеру такие строки define("DBHOST","localhost").
По-моему, проще будет юзеру с такой структурой работать:
[database_parametres]
dbhost=localhost
 

Andreika

"PHP for nubies" reader
А с чего ты взял что структура у меня должна быть такой
это не я взял, этот бред придумал ты

....
устроила - я рад за тебя )
 

.des.

Поставил пиво кому надо ;-)
Угу.. давно я кстати в доку не заглядывал :)
Действительно изменили.

http://cvs.php.net/viewcvs.cgi/phpdoc/en/reference/filesystem/functions/parse-ini-file.xml?view=diff&r1=text&tr1=1.20&r2=text&tr2=1.19&diff_format=h

Вообщем одно из двух или в ключах Вы не используете [] (ну и все остальные) и тогда parse_ini_file или explode.

А судя по начальному условию Andreika прав.


Хотя лично я не понимаю, какие технические сложности в том, чтобы ключи могли содержать символы ()[]~
 
Сверху