Что нового

[RegExp] Config - управление файлом конфигурации

IMStrelcov

CTPEJIbLLOB
Сообщения
253
Репутация
64
Несколько функций для поддержки вашими приложениями работы с файлом конфигурации

Код:
#cs------------------------------------------
функции работают с файлом конфигурации содержащий следующую структуру:
	Ключ1 1
	;коментарий
	Ключ2 Значение1
	Ключ3 Значение1 "Значени2" Значение3
	Ключ4
так же перед и после ключа и после значения могут быть множественные пробелы и табы которые игнорируются если они не вкавычках.
так же если ключ есть но нет значения, то такому ключу будет присвоено значение в единицу.
#ce------------------------------------------


#cs
Данная функция разбивает команды написаные в одну строку на многострочный конфиг.
Т.Е. командная трока:
	-Ключ1 /Ключ2=Значение1 Ключ3="Значение1 ""Значени2"" Значение3"
после обработки примет вид:
	Ключ1 1
	Ключ2 Значение1
	Ключ3 Значение1 "Значени2" Значение3
где первое слово в строке это параметр, а последующие слова в этой же строке, значение этого параметра.
знаки - и / в начале имени ключа и лишние пробелы в начале и конце каждого ключа и его значения удаляются, кроме пробелов которые в кавычках.
#ce
Global $sString = '       -  BaLib=         "1uu"   0  1Hndl="2 ""8"" rt ""p[o"" t" /2Hndl  =   "3" qwe   =   rty   -r    qwe2   =rty        '
$sCfg = Cfg_OfCmd_($sString)
ConsoleWrite($sCfg&@CRLF)







#cs------------------------------------------
почистить от пустых строк и комментариев
----------------------------------------------
$_sCfg =	строка с параметрами
----------------------------------------------
$_iOpt =	может быть комбинация из след. значений
				1 - удалить пустые строки
				2 - удалить комментарии
----------------------------------------------
возращает новую строку с параметрами
#ce------------------------------------------
Func Cfg_Clean_($_sCfg, $_iOpt = 1)
	If BitAND($_iOpt, 1) Then
		$_sCfg = StringRegExpReplace($_sCfg, '(?m)^[\s]+', '');удалить пустые строки
	EndIf
	If BitAND($_iOpt, 2) Then
		$_sCfg = StringRegExpReplace($_sCfg, '(?m)^;.*\s\s', '');удалить коментарии
	EndIf
	Return $_sCfg
EndFunc

#cs------------------------------------------
сохранить параметры в файл
----------------------------------------------
$_sCfg =	строка с параметрами
----------------------------------------------
$_sFile =	файл в который сохранить
#ce------------------------------------------
Func Cfg_Save_($_sCfg, $_sFile)
	Local $_hFile = FileOpen($_sFile, 2 +8)
	FileWrite($_hFile, $_sCfg)
	FileClose($_hFile)
EndFunc

#cs------------------------------------------
открыть файл с параметрами
----------------------------------------------
$_sFile =	файл с параметрами
----------------------------------------------
возвращает новую строку с параметрами
#ce------------------------------------------
Func Cfg_Open_($_sFile)
	Local $_sCfg = FileRead($_sFile)& @CRLF
	$_sCfg = StringRegExpReplace($_sCfg, '^\s*|\s*$', '')& @CRLF;удалить в начале и конце текста пустые строки
	$_sCfg = StringRegExpReplace($_sCfg, '(?m)(^[^;\s][^\s]*\h*$)', '$1 1');добавить значение пустым параметрам
	Return $_sCfg
EndFunc

#cs------------------------------------------
добавить перезаписать или удалить параметр
----------------------------------------------
$_sCfg =	строка с параметрами
----------------------------------------------
$_sKey = параметр
----------------------------------------------
$_sValue = значение, если оставить ноль, то параметр удалится
#ce------------------------------------------
Func Cfg_Write_(ByRef $_sCfg, $_sKey, $_sValue = 0)
	$_sKey = StringRegExpReplace($_sKey, '(?m)\s', '')
	If Not $_sValue Then
		$_sCfg = StringRegExpReplace($_sCfg, '(?mi)^\h*'&$_sKey&'\h*(.*)?\s+', '')
	Else
		$_sCfg = StringRegExpReplace($_sCfg, '(?mi)^(\h*'&$_sKey&'\h*)(.*)?\s', '$1'& $_sValue)
		If Not @extended Then
			$_sCfg &= $_sKey& ' '& $_sValue& @CRLF
		EndIf
	EndIf
EndFunc

#cs------------------------------------------
получить значение параметра
----------------------------------------------
$_sCfg =	строка с параметрами
----------------------------------------------
$_sKey =	параметр
----------------------------------------------
возращает значение параметра или ноль если параметра нет
#ce------------------------------------------
Func Cfg_Read_(ByRef $_sCfg, $_sKey)
	$_sKey = StringRegExpReplace($_sKey, '(?m)\s', '')
	$_sKey = StringRegExp($_sCfg, '(?mi)^\h*'& $_sKey&'\h*(.*)\h*$', 1)
	$_sKey = @extended ? $_sKey[0] : 0
	Return $_sKey
EndFunc

#cs------------------------------------------
конвертирует командную строку в параметры
----------------------------------------------
$_sCmd =	командная строка
----------------------------------------------
возвращает новую строку с параметрами
#ce------------------------------------------
Func Cfg_OfCmd_($_sCmd)
	$_sCmd = StringRegExpReplace($_sCmd, '\h*(?:[-/])?\h*([^\h"=]*)\h*(?:(?:=)\h*(?:(?:(?:")((""|[^"]*)*)(?:"))|([^"\h]*)))?\h*', '$1 $2$4'& @CRLF)
	$_sCmd = StringRegExpReplace($_sCmd, '""', '"');заменить двойные кавычки
	$_sCmd = StringRegExpReplace($_sCmd, '(?m)^([^\s]+)\h$', '$1 1');добавить значение пустым параметрам
	$_sCmd = StringRegExpReplace($_sCmd, '(?m)^([\s]+)', '');удалить пустые строки
	Return $_sCmd
EndFunc
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Может лучше это в раздел примеров/UDF?
Тут как бы решаем проблемы по рег. выражениям.
 
Верх