Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Проблема с регулярными выражениями

244
30 августа 2006 года
UAS
2.0K / / 19.07.2006
Имеется исходный файл vars.php, он должен будет обрабатываться, а именно в нём будет

производится замена с помощью PCRE
Код:
######################################
// vars.php

if(!defined("INDEX"))define("INDEX","http://gb/");
if(!defined("ADMIN_EMAIL"))define("ADMIN_EMAIL","xxx@mail.ru");

$m_on_page=10;
$pages_on_raw=10;

$arg_sizes=array(
  "name"=>array(20,true),
  "email"=>array(30,false),
  "url"=>array(50,false),
  "icq"=>array(15,false),
  "message"=>array(5000,true)
);

######################################


Теперь файл обработчик:
Код:
######################################
//work.php

$vars_file="vars.php";
$filev=implode("",file($vars_file));

# Поступающие данные в этот файл:
$const=array(
   "INDEX"=>"http://blabla.ru",
   "ADMIN_EMAIL"=>"email@email.com"
);

$vars=array(
   ["m_on_page"]=5,
   ["pages_on_raw"]=20
);

$sizes=array(
   ["name"]=20,
   ["email"]=40,
   ["message"]=6000
);


# Регулярные выражения, которые совсем не пашут...
# P.S.:  в рег.выражениях я не мастер, так что прошу не смеятся... :(
foreach($const as $k=>$v) {
 $filev=preg_replace('#define\("'.strtoupper($k).'","(.*?)"\)(\x59)?#U','define("'.strtoupper($k).'","'.htmlspecialchars($v).'")',$filev);
}
foreach($vars as $k=>$v) {
   $filev=preg_replace('#'.$k.'=(.*?)(\x59)?#iU',($k.'='.htmlspecialchars($v).';'),$filev);
}
foreach($sizes as $k=>$v) {
  $v=(int)$v;
  $filev=preg_replace('#'.$k.'(.+)=>.*array\(.+?,(.+?)\)(\x44)?#iU',($k."\\0=>array($v,\\1);"),$filev);
}

/*
Надо сделать так, чтобы обрабатывался файл vars.php и его переменные заменялись на те,

которые обозначены во выше написанных массивах... Как я только не извращался с этими

preg_replac'ами, но так уже целый день сижу (+вчера) и всё никак не хочет php заменять по

правильному...
*/


######################################



Помогите написать правильные preg_replace хотя бы для одной замены, там я уже додумаю
8
30 августа 2006 года
mfender
3.5K / / 15.06.2005
Меня немного поразили во всём этом следующие строки (цитирую их, как произведшие сильное впечатление):

 
Код:
$vars_file="vars.php";
$filev=implode("",file($vars_file));


Чего ты этим самым хотел добиться?

И ещё. А где те самые пресловутые процедуры замены чего-то на чего-то?
244
30 августа 2006 года
UAS
2.0K / / 19.07.2006
mfender, этим я считываю содержимое файла, ну или если тебе так не

нравится, то перепишу:
 
Код:
$vars_file="vars.php";
$filev=fread(fopen($vars_file,"r"),filesize($vars_file));


Первый пост отредактировал...
20K
30 августа 2006 года
SerejK
5 / / 25.08.2006
Я могу посоветовать то, что посоветовали мне...Сам недавно столкнулся с регулярными выражениями...Есть такая программка RegExp COach, думаю, найти ее в интеренет не проблема..(Если что - куда-нить выложу ее)..ТАк вот в ней можно визуально отладить регулярное выражение, при условии, конечно, то владеешь хотя бы книжкой с основами синтаксиса... Там визуально подсвечивается выбор из строки по текущему шаблону, причем в реальном времени! Очень удобно! И еще...Не используй, как мне тоже посоветовали, Perl-совместимые функции (типа preg_replace и прочие..) С ними много замут в синтаксисе...Используй Posix -функции, типа ereg_...
Удачи!
244
30 августа 2006 года
UAS
2.0K / / 19.07.2006
SerejK, спасибо, поищу. Но за preg_* выражениями будущее! Я считаю... Тем более я где-то читал, что их (Posix) вообще уберут из PHP в последующих версиях...
8
30 августа 2006 года
mfender
3.5K / / 15.06.2005
[QUOTE=SerejK]И еще...Не используй, как мне тоже посоветовали, Perl-совместимые функции (типа preg_replace и прочие..) С ними много замут в синтаксисе...Используй Posix -функции, типа ereg_...[/QUOTE]
Ты щас научишь! Через год ereg вообще в PHP отменят. Уже года два его (PHP) создатели не рекомендуют пользоваться функциями ereg, предупреждая, что его очень скоро не станет.


2UAS: попробу вот так:

 
Код:
foreach($const as $k=>$v) {
    $filev=preg_replace('#define\(\x22'.strtoupper($k).'\x22,\x22.*?\x22\)\x59?#U','define("'.strtoupper($k).'","'.htmlspecialchars($v).'")',$filev);
}
foreach($vars as $k=>$v) {
    $filev .= preg_replace('#'.$k.'=.*?\x59?#iU',($k.'='.htmlspecialchars($v).';'),$filev);
}
foreach($sizes as $k=>$v) {
    $v=(int)$v;
    $filev.=preg_replace('#(\x22'.$k.'\x22).+=>.*array\(.+?,.+?\)\x44?#iU',("\\0=>array($v,\\1);"),$filev);
}


Ты понаставил там лишних немного скобок. В случае замены они не особо нужны, если ты заменяешь на свои значения.
244
30 августа 2006 года
UAS
2.0K / / 19.07.2006
mfender, с меня бутылка!!! Пасиб за помощь... Я чуть ещё посидел, так как последнее выражение глючило... Фишка в том, что php почему-то не хотел понимать знак "," как "\x44". Короче вот я всё исправил, теперь всё пашет!!!
 
Код:
$filev=preg_replace('#.*?(\x22'.$k.'\x22).*?=>.*?array\(.+?,(.+?)\)#iU',("\\1=>array($v,\\2)"),$filev);

Я думал не успею до начала универа разобратся с этой фигнёй!!!

SerejK, спасибо! Прога реально хорошая!!! А переделать из Posix в PCRE легко!!!
P.S.: в PHP6 Posix выражений уже не будет!!!

Спасибо! Тему можно закрывать...
8.8K
24 октября 2006 года
Alximik
95 / / 24.10.2006
Вот зыте, люди, почему так получатеся?
Если вот допустим такой код
 
Код:
$ftext = '1<title>a</title>b<title>2</title>3';
$title_arr = spliti('<title>[^<>]+</title>', $ftext);


То в массив кидает '1', '2', '3'. А я хочу получить 'a', 'b'.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог