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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> regexp замена текста в файле, нужен help! 
V
    Опции темы
firedrago
Дата 3.6.2006, 11:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Всем привет,
вот срожаюсь и не могу победить.....не силен я в regexpах.....

есть файл с содержанием типа-
Код

##   # - не активный ## - коментарий
VAR=111
VAR2A=222
#VAR3=333
#VAR4=444  # var4 bla bla bla
# VAR5="zzzzz
zzzzzzzzzzzzz"

и мне надо заменять там например VAR= на #VAR=,  #VAR3=.... на VAR3=123, # VAR5=... на VAR5="abrakadabra".
я пробовал сделать это как-то так
Код

function file_replace ($search, $replace, $filename) {
       if (file_exists($filename)) {
           $cnt = file_get_contents($filename);
           if (preg_match($search, $cnt)) {
               //$cnt = eregi_replace($search, $replace, $cnt); - почему-то не работает с моим regexpом
               preg_match_all($search, $cnt, $data);
               $cnt = str_replace($data[0][0],$replace, $cnt);
               return file_put_contents($filename, $cnt);
           }
           return true;
       }
       return false;
   }

file_replace("/([#]{0,1}VAR=)+([\"]?.+[\"]?)/", "VAR=1234567890", "/tmp/myfile");

так работает, но-
1. ему все равно где начинается стринг ##VAR= -он тоже находит, а коментарии он должен игнорировать
2. если б это было VAR4  то он взял бы всю строчку вместе с коментарием - тоже не желательно
3. что делать с параметром типа VAR5 я вообще не знаю, его значение на нескольких строках, а как это все заменить даже нет идеи

помогите pls.............
зарание благодарен! 
PM MAIL   Вверх
Mal Hack
Дата 3.6.2006, 14:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


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

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



Можно еще раз по русски описать что на что заменять, а что не надо. 
PM ICQ   Вверх
firedrago
Дата 3.6.2006, 14:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



 smile 
еще раз по русски - 
1. замена не активированого (#VAR4=444) параметра
-----------------------
##   # - не активный ## - коментарий
VAR=111
VAR2A=222
#VAR3=333
##VAR4= bla bla
#VAR4=444  # var4 bla bla bla
# VAR5="zzzzz
zzzzzzzzzzzzz"
-----------------------
 на активный с новым значением (896)
-----------------------
##   # - не активный ## - коментарий
VAR=111
VAR2A=222
#VAR3=333
##VAR4= bla bla
VAR4=896  # var4 bla bla bla
# VAR5="zzzzz
zzzzzzzzzzzzz"
-----------------------
при этом (##VAR4= bla bla)  и (# var4 bla bla bla) должны оставаться не измененными т.к. это коментарий(##VAR4= bla bla) и  (# var4 bla bla bla)

2.замена значения (VAR5) cо значением в кавычках текст может быть на нескольких строках
-----------------------
##   # - не активный ## - коментарий
VAR=111
VAR2A=222
#VAR3=333
##VAR4= bla bla
#VAR4=444  # var4 bla bla bla
# VAR5="zzzzz
zzzzzzzzzzzzz"

-----------------------
например на
-----------------------
##   # - не активный ## - коментарий
VAR=111
VAR2A=222
#VAR3=333
##VAR4= bla bla
#VAR4=444  # var4 bla bla bla
# VAR5="bbbb
bbbbbbb
bbbb
bbbb
"
-----------------------

это основное..... а дальше я сам поробую....... 
PM MAIL   Вверх
Mal Hack
Дата 4.6.2006, 00:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


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

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



Код
<?php

$t = <<<EOF
##   # - не активный ## - коментарий
VAR=111
VAR2A=222
#VAR3=333
##VAR4= bla bla
#VAR4=444  # var4 bla bla bla
# VAR5="zzzzz
zzzzzzzzzzzzz"
EOF;


$t = preg_replace( "#\#\s*VAR(\d+)=(\d+)(.+?)#" , "VAR\\1=864\\3" , $t );
print $t . "<br />";

$t = <<<EOF
##   # - не активный ## - коментарий
VAR=111
VAR2A=222
#VAR3=333
##VAR4= bla bla
#VAR4=444  # var4 bla bla bla
# VAR5="zzzzz
zzzzzzzzzzzzz"
EOF;


$t = preg_replace( "#\#\s*VAR(\d+)=(\"|\')(.+?)\\2#s" , "VAR\\1=\\2new text\\2" , $t );
print $t . "<br />";

?>
 
PM ICQ   Вверх
firedrago
Дата 4.6.2006, 14:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



@Mal Hack - спасибо за примеры, но это немного не то, что мне надо (видать у меня с русским проблемы  smile  ) попробую еще раз на живом примере.....
итак имеем часть файла
---------------------------------------------
##HTTPS Variables
HTTPSDIR="/stat/var/www" # Define the location to serve HTTPS from
HTTPSCGI="yes" # Whether to enable CGI in the above path
#OVPN_VERBOSITY=1
#OVPN_PUSH1="route 192.168.0.0 255.255.255.0"

##/etc/issue.net is used by SSHD, more to come
NETISSUE="WARNING!!!
This system is solely for the use....."
---------------------------------------------
теперь как я это вижу
1. начало строки /^\s*
2. возможное наличие коментария # [#]{0,1}
3. название переменной напр. HTTPSDIR=,  OVPN_VERBOSITY=, NETISSUE=
на данном этапе имеем /^\\s*[#]{0,1}ПЕРЕМЕННАЯ=

---------------------------------------------
##HTTPS Variables
HTTPSDIR="/stat/var/www" # Define the location to serve HTTPS from
HTTPSCGI="yes" # Whether to enable CGI in the above path
#OVPN_VERBOSITY=1
#OVPN_PUSH1="route 192.168.0.0 255.255.255.0"

##/etc/issue.net is used by SSHD, more to come
NETISSUE="WARNING!!!
This system is solely for the use....."
---------------------------------------------
тут вроде все ок, но вот теперь пункты которые я не знаю как реализовать......
4. значение переменной может быть в кавычках " или без
5. после значения (не зависимо от того в кавычках или нет) может быть коментарий типа
HTTPSCGI="yes" # Whether to enable CGI in the above path
#OVPN_VERBOSITY=1 # bla bla
6. значение в кавычках может содержать пробелы, буквы,цифры, слэши и т.д.
HTTPSDIR="/stat/var/www" # Define the l
#OVPN_PUSH1="route 192.168.0.0 255.255.255.0"
7. значение в кавычках может мыть на нескольких строках
NETISSUE="WARNING!!!
This system is solely for the use....."


вот вроде и все...
 
PM MAIL   Вверх
Mal Hack
Дата 4.6.2006, 15:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


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

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



Цитата(firedrago @  4.6.2006,  14:51 Найти цитируемый пост)
теперь как я это вижу

Ты объясни чего ты хочешь, блин, а не как ты это видешь.
Что и куда. 
PM ICQ   Вверх
firedrago
Дата 4.6.2006, 15:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



у меня есть html форма для этого конфига
и если я изменяю значения в форме то она должна находить правильную переменную  в файле и заменять ее на новую напр.
HTTPSCGI="yes"
 # Whether to enable CGI in the above path  >>> HTTPSCGI="no" # Whether to enable CGI in the above path
если переменная была деактивирована напр. #OVPN_VERBOSITY=1 и ее активирую то должна заменяться
на OVPN_VERBOSITY=1
естественно коментари должны оставаться на своих местах 
PM MAIL   Вверх
firedrago
Дата 4.6.2006, 20:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



 smile  так вроде сделал....может можно еще как-то усовершенствовать?

$regexp='/(^\\s*[#]{0,1}'.$item.'=("[^"]*.|[^\\n\\\\W ]*.|\\n))/m';

$item - имя переменной 
PM MAIL   Вверх
Mal Hack
Дата 5.6.2006, 01:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


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

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



firedrago, мне вот  интересно, как это работает, если у тебя вначале строки должен символ "\" стояить, а потом буква s ноль и более раз...

Код
<?php
$t = <<<EOF
##   # - не активный ## - коментарий
VAR=111
VAR2A=222
#VAR3=333
##VAR4= bla bla
#VAR4=444  # var4 bla bla bla
# VAR5="zzzzz
zzzzzzzzzzzzz"
EOF;
$item = "VAR4";
$value = 24234;
$t = preg_replace( "#(^|\s)\#\s*".$item."=(\d+)(.+?)#" , "\n".$item."=".$value."\\5" , $t );
print $t . "<br />";
$t = <<<EOF
##   # - не активный ## - коментарий
VAR=111
VAR2A=222
#VAR3=333
##VAR4= bla bla
#VAR4=444  # var4 bla bla bla
# VAR5="zzzzz
zzzzzzzzzzzzz"
EOF;
$item = "VAR5";
$value = "New ddfsfsfdtr";
$t = preg_replace( "#(^|\s)\#\s*".$item."=(\"|\')(.+?)\\2#s" , "\n".$item."=\\2".$value."\\2" , $t );
print $t . "<br />";
?>
 
PM ICQ   Вверх
firedrago
Дата 5.6.2006, 02:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



ой, если б я знал.....как-то работает........
посмотри на картинки может понятно будет, да мне объясниш.......
user posted image
user posted image
user posted image 
PM MAIL   Вверх
Mal Hack
Дата 5.6.2006, 11:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


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

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



Мне картинка ничего не говорит, я скрипты запускаю и по ним работу смотрю. 
PM ICQ   Вверх
firedrago
Дата 6.6.2006, 22:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



...да ты действительно прав! это там лишнее....
вот мой последний вариант  (^[#]{0,1}VAR=("[^"]*.|[^\n\W ]*.|$))
1. позиция в начале строки после символа конец строки (^[#]{0,1}VAR=("[^"]*.|[^\n\W ]*.|$))
2. символ # может встретиться 0 или 1 раз (^[#]{0,1}VAR=("[^"]*.|[^\n\W ]*.|$))
3. название моей переменной (^[#]{0,1}VAR=("[^"]*.|[^\n\W ]*.|$))
4. если символ " (^[#]{0,1}VAR=("[^"]*.|[^\n\W ]*.|$))
4.a. любой символ только не " повторяющийся сколько угодно раз (^[#]{0,1}VAR=("[^"]*.|[^\n\W ]*.|$)) 
4.b. любой символ только не новой строки (в нашем случае закрытие кавычки) (^[#]{0,1}VAR=("[^"]*.|[^\n\W ]*.|$))
(4-4.b. находит строки типа 
VAR="1234"
#VAR="12
34"
все что после закрытых ковычек - игнорируется
) 
5. или любой символ много раз только не (конец новая строка, не буквы, пробел) (^[#]{0,1}VAR=("[^"]*.|[^\n\W ]*.|$))
(находит  строки
VAR=123 # bla bla
#VAR=21321321
)
6. иначе если конец строки (^[#]{0,1}VAR=("[^"]*.|[^\n\W ]*.|$))
(
находит строки
VAR=
)

правильно ?

Код

if(preg_match('/(^[#]{0,1}VAR=("[^"]*.|[^\n\W ]*.|$))/m', $subject)){

}else{

}



 
PM MAIL   Вверх
Mal Hack
Дата 7.6.2006, 23:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


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

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



Цитата(firedrago @  6.6.2006,  22:58 Найти цитируемый пост)
правильно ?

сложно сказать. Я свой вариант написал, вроде бы он работает. Если честно, я несколько не догнао условие поставленной задачи smile 
PM ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Тексты | Следующая тема »


 




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


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

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