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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите с регулярным выражением 
:(
    Опции темы
Raptus Melanholicus
Дата 26.1.2004, 03:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 6.1.2004
Где: Kiev::Ua

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



Мне нужно чтобы функция меняла в тексте {varname} на значение $GLOBALS['varname']. Что-то у меня не получается..
PM MAIL WWW ICQ   Вверх
maksar
Дата 26.1.2004, 07:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



У меня в общем-то вопрос по той-же теме мне нужно реплейсом заминить все сылки на рисунки типа "http://site.ru/images/image.jpg" и "/images/image.jpg" на "image.jpg"(просто на имя файла этого рисунка).
PM MAIL   Вверх
Secandr
Дата 26.1.2004, 08:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Связист
****


Профиль
Группа: Экс. модератор
Сообщений: 4043
Регистрация: 3.8.2003
Где: Russia, Volgograd

Репутация: 5
Всего: 39



Raptus Melanholicus
А если так:
Код
eregi_raplace('{([^}]+)}',$GLOBALS["\\1"]);

Попробуй!


--------------------
Мышки плакали, кололись, но продолжали жрать кактусы (с) cisco
PM ICQ AOL   Вверх
Master
Дата 26.1.2004, 12:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 8
Всего: 10



Secandr неа, так не работает, даже если функцию правильно написать smile.gif

Я вот так делал:

Код
foreach($arr as $k => $v) {
$str = str_replace($k,$v,$str);
}


Это сообщение отредактировал(а) Master - 26.1.2004, 12:32


--------------------
Вавилон, Вавилон
Что ты построил, что разрушил?
Вавилон, Вавилон
Плавятся души дьявольским огнем.
PM WWW ICQ   Вверх
Secandr
Дата 26.1.2004, 13:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Связист
****


Профиль
Группа: Экс. модератор
Сообщений: 4043
Регистрация: 3.8.2003
Где: Russia, Volgograd

Репутация: 5
Всего: 39



Master raplace КЛАСС!!!!! smile.gifsmile.gifsmile.gifsmile.gif

Master Врёшь, невозмёшь, вот тебе рабочий код аля "я полный извращенец" smile.gif
Код
<?
$str="Вот вам шаблон, {d} {n} php {vosk}";
$G['d']='f***';
$G['n']='y**';
$G['vosk']='!!!!';
echo $str = preg_replace_callback("/{([^}]+)}/", "t", $str);
function t($in){
global $G;
return $G[$in[1]];
}
?>
Только подазреваю работает немного медленнее.


--------------------
Мышки плакали, кололись, но продолжали жрать кактусы (с) cisco
PM ICQ AOL   Вверх
Master
Дата 26.1.2004, 15:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 8
Всего: 10



Secandr да, ты точно извращенец biggrin.gif
но РАБОТАЕТ smile.gif


--------------------
Вавилон, Вавилон
Что ты построил, что разрушил?
Вавилон, Вавилон
Плавятся души дьявольским огнем.
PM WWW ICQ   Вверх
MuToGeN
Дата 26.1.2004, 15:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лесник
****


Профиль
Группа: Модератор
Сообщений: 4379
Регистрация: 15.8.2002
Где: Москва

Репутация: 7
Всего: 32



Код
<?
$t="А правда, что {who} {whatDoes} {what}?\n";
$G[who]="MuToGeN";
$G[whatDoes]="пьет";
$G[what]="пиво";

$bracketOpen=false; // изначально скобки не открыты
for($i=0;$i<strlen($t);$i++){ // просматриваемс каждый символ
   if($t[$i]=="{"&&!$bracketOpen){ // если попалось "{" и скобки не открыты, то
       $bracketOpen=true; // будем считать, что они уже открыты
       $varName=""; // сбрасываем имя переменной после прошлого раза
       continue; // дальше продолжать итерацию смысла нет, да и "{" приклеится к имени переменной
   }
   if($t[$i]=="}"&&$bracketOpen){ // если "}" и скобки открыты, то
       $bracketOpen=false; // закрываем скобки
       $parsed.=$G[$varName]; // добавляем к тому, что получится в результате, значение нужной переменной
       continue; // опять же нет смысла продолжать итерацию
   }
   if($bracketOpen){ // если скобки открыты, то
       $varName.=$t[$i]; // текущий символ относится к имени переменной
   }else{ // а если закрыты, то
       $parsed.=$t[$i]; // текущий символ - статический текст
   }
}
echo $parsed;
// (C) MuToGeN
?>
Должно быть гораздо быстрее.


--------------------
Three pings for the token rings,
Five pings for the UNIX machines,
Hundred pings for the broken links,
One special ping to check them all
Through Simple Network Management Protocol!
PM MAIL ICQ   Вверх
Secandr
Дата 26.1.2004, 18:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Связист
****


Профиль
Группа: Экс. модератор
Сообщений: 4043
Регистрация: 3.8.2003
Где: Russia, Volgograd

Репутация: 5
Всего: 39



Master спасибо smile.gif


--------------------
Мышки плакали, кололись, но продолжали жрать кактусы (с) cisco
PM ICQ AOL   Вверх
Raptus Melanholicus
Дата 26.1.2004, 19:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 6.1.2004
Где: Kiev::Ua

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



ого... а одним регулярным выражением низя? .. очень хочется сделать так
Код
eregi_raplace('{([^}]+)}',$GLOBALS["\\1"]);
но этот способ почему-то не работает..


Фот эта функция
Код
preg_replace("~{([0-9a-z_\[\]\$\(\)]+)}~ie", "\\1", $text);
заменяет в тексте конструкции {$varname} на значения $varname .. Меня это почти устраивает, хочется только убрать символ $ из текста и, так как данная функция заключена в класс, нужно чтоб она могла пользоваться всеми глобальными переменными. Для этого нужно либо внутри функции объявлять global $varname; либо заменять ключевые слова на $GLOBALS['varname'] ..

Это сообщение отредактировал(а) Raptus Melanholicus - 26.1.2004, 20:19
PM MAIL WWW ICQ   Вверх
Secandr
Дата 26.1.2004, 20:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Связист
****


Профиль
Группа: Экс. модератор
Сообщений: 4043
Регистрация: 3.8.2003
Где: Russia, Volgograd

Репутация: 5
Всего: 39



Raptus Melanholicus Я так и не понял почему не работает, такое впечатление, что "\\1" возвращает какие-то дополнительные символы sad.gif


--------------------
Мышки плакали, кололись, но продолжали жрать кактусы (с) cisco
PM ICQ AOL   Вверх
Raptus Melanholicus
Дата 26.1.2004, 20:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 6.1.2004
Где: Kiev::Ua

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



Secandr Я тоже не понимаю.. Проверял - никаких дополнительных символов там нет.
PM MAIL WWW ICQ   Вверх
Secandr
Дата 26.1.2004, 20:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Связист
****


Профиль
Группа: Экс. модератор
Сообщений: 4043
Регистрация: 3.8.2003
Где: Russia, Volgograd

Репутация: 5
Всего: 39



Raptus Melanholicus Как проверял?


--------------------
Мышки плакали, кололись, но продолжали жрать кактусы (с) cisco
PM ICQ AOL   Вверх
Raptus Melanholicus
Дата 26.1.2004, 21:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 6.1.2004
Где: Kiev::Ua

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



Secandr Если бы "\\1" содержал лишние символы, то не работала бы функция preg_replace("~{([0-9a-z_\[\]\$\(\)]+)}~ie", "\\1", $text);

PM MAIL WWW ICQ   Вверх
Secandr
Дата 26.1.2004, 21:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Связист
****


Профиль
Группа: Экс. модератор
Сообщений: 4043
Регистрация: 3.8.2003
Где: Russia, Volgograd

Репутация: 5
Всего: 39



Raptus Melanholicus не факт.
А можно ли применить такую конструкцию для теста:
eregi_raplace('{([^}]+)}',$GLOBALS["\\1"]=1);
А потом foreach`ом прогнать ключи.


--------------------
Мышки плакали, кололись, но продолжали жрать кактусы (с) cisco
PM ICQ AOL   Вверх
Raptus Melanholicus
Дата 26.1.2004, 21:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 6.1.2004
Где: Kiev::Ua

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



Решение найдено, работает вот так
Код
"\$GLOBALS['\\1']"


И вся функция вот:
Код
preg_replace("/{([0-9a-z_\[\]\(\)]+)}/ie", "\$GLOBALS['\\1']", $text);


Всем пасиба smile.gif

Это сообщение отредактировал(а) Raptus Melanholicus - 26.1.2004, 21:44
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




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


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

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