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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Регулярное выражение 
V
    Опции темы
patap
Дата 11.12.2012, 13:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 893
Регистрация: 7.5.2005
Где: Украина, Зп

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



помогите составить выражение

есть код
Код

{t}asdfa{/t}
{assix sdf=asd}
{literal}
  function foo()  {
   
  }
{/literal}
{t pref="p"}asdfasd{/t}
{capture}
   {t pref="p"}asdfasd{/t}
{/capture}


нужно заменить все { - на {ldelim}
                                  } - на {rdelim}
конструкции типа {t pref="p"}asdfasd{/t} должны остаться в исходном виде.

т.е на выходе нужно получить:
Код

{t}asdfa{/t}
{ldelim}assix sdf=asd{rdelim}
{ldelim}literal{rdelim}
  function foo()  {ldelim}
   
  {rdelim}
{ldelim}/literal{rdelim}
{t pref="p"}asdfasd{/t}
{ldelim}capture{rdelim}
   {t pref="p"}asdfasd{/t}
{ldelim}/capture{rdelim}


хотя бы на мысль натолкните


--------------------
На боку кобура болталась, сзади шашка отцовская звякала. 
Впереди меня все хохотало, а позади все плакало (с)
PM MAIL ICQ   Вверх
baldina
Дата 11.12.2012, 13:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



find: {([^t])([^{]+)([^t])}
replace: {ldelim}$1$2$3{rdelim}

не вполне то (не будет заменять любые теги, начинающиеся и заканчивающиеся на t), но в данном случае кажется работоспособным



Это сообщение отредактировал(а) baldina - 11.12.2012, 14:12
PM MAIL   Вверх
patap
Дата 11.12.2012, 14:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 893
Регистрация: 7.5.2005
Где: Украина, Зп

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



да. немного не то...
я сейчас смотрю в сторону позитивного/негативного просмотра вперед/назад

вот написал
Код

{(?!(t\s+|/t)).*


но оно в данном случае не хавает одиночно стоящую }

  function foo()  {
   
  }

Добавлено через 3 минуты и 43 секунды
вот пока что полуподходящее
Код

{(?!(t\s+|/t))


это выгребет все { после которых нет {t 

теперь надо для закрывающих скобок


--------------------
На боку кобура болталась, сзади шашка отцовская звякала. 
Впереди меня все хохотало, а позади все плакало (с)
PM MAIL ICQ   Вверх
baldina
Дата 11.12.2012, 14:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



думаю так точнее:
Код

{(/?)([^/t])([^{]+)}

Код

{ldelim}$1$2$3{rdelim}


Добавлено @ 14:27
если возможны одинокие скобки, то их замена должна независимо проводиться. это уже более чем одна замена, одним выражением не получится.

Добавлено @ 14:31
а что касается 
Код

fufunction foo()  {
   
  }

заменяется нормально (при глобальной а не построчной замене, естественно):
скобки успешно сопоставляются с выражением. нужно, что бы между скобками было минимум 2 символа. можно сократить для одного, если заменить [^{]+ на [^{]*


Это сообщение отредактировал(а) baldina - 11.12.2012, 14:33
PM MAIL   Вверх
skyboy
Дата 11.12.2012, 14:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


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

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



1. поставить третий Смарти. там не требуется морочиться с {rdelim}/{ldelim}. 
2. я так понимаю, у тебя введенный через WYSIWYG текст сохраняется и используется как Смарти-шаблон? тогда не давать писать джаваскрипт непосредственно в шаблон. это в любом случае не хорошо. а здесь — еще и веселье с экранированием получается. пускай будет список макросов — предопределенных джаваскрипт блоков(типа {jquery-plugin name="autocomplete" target="#id1"}, который развернется в jQuery('#id1').autocomplete();)
PM MAIL   Вверх
patap
Дата 11.12.2012, 15:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 893
Регистрация: 7.5.2005
Где: Украина, Зп

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



baldina, спасибо. помогло, только добавил чтобы не хавало все что с t начинается

Код

$content = preg_replace('#{(/?)([^/t]\s?)([^{]+)}#', '{ldelim}$1$2$3{rdelim}', $content);



skyboy, тут совершенно не очевиден контекст ситуации. Это временное решение проблемы, мне нужно обработать смарти только {t}...{/t} (это плагин переводы подставит)
остальное потом должно быть обработано со всеми смарти конструкциями
почему так? - так повелось, позже будет сделано по другому)

т.е к примеру:
шаг 1
Код

{assign var="foo" value="asdf"}
<div>{t pref="f"}message_id{/t}</div>

шаг 2 делаем реплейсы
Код

{ldelim}assign var="foo" value="asdf"{rdelim}
<div>{t pref="f"}message_id{/t}</div>

шаг 3 прогоняем через смарти
Код

{assign var="foo" value="asdf"}
<div>Text with message_id</div>

шаг 4 сохранить шаблон.



--------------------
На боку кобура болталась, сзади шашка отцовская звякала. 
Впереди меня все хохотало, а позади все плакало (с)
PM MAIL ICQ   Вверх
baldina
Дата 11.12.2012, 16:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(patap @  11.12.2012,  15:38 Найти цитируемый пост)
добавил чтобы не хавало все что с t начинается

Цитата

\s?

поскольку пробел опциональный, это не дает никакого результата: например {tt} не будет заменяться, т.к. вторая t сопоставляется со следующей группой
PM MAIL   Вверх
patap
Дата 11.12.2012, 16:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 893
Регистрация: 7.5.2005
Где: Украина, Зп

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



блин, начал тестить. может быть такая конструкция - ее обрабатывает не верно..

{*{$foo}*}

Добавлено через 10 минут и 56 секунд
в общем мне нужно эту скобку не учитывать при просмотре вперед или назад... именно ее не могу учесть
{t prefix="lp"}api_confirm_text2{/t}


--------------------
На боку кобура болталась, сзади шашка отцовская звякала. 
Впереди меня все хохотало, а позади все плакало (с)
PM MAIL ICQ   Вверх
baldina
Дата 11.12.2012, 16:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



отрицание строки, насколько понимаю, можно сделать только просмотром, типа такого:
Код

({)((?!/?t(?:\s|})))([^{]+)}


Добавлено через 22 секунды
Код

{ldelim}$2$3{rdelim}

PM MAIL   Вверх
patap
Дата 11.12.2012, 16:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 893
Регистрация: 7.5.2005
Где: Украина, Зп

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



тот же еффект
Код

$c = preg_replace('#{((?!t\s+|/t).*?)}#s', '{ldelim}$1{rdelim}', $content);


обработает как 
{ldelim}*{$foo{rdelim}*}


--------------------
На боку кобура болталась, сзади шашка отцовская звякала. 
Впереди меня все хохотало, а позади все плакало (с)
PM MAIL ICQ   Вверх
baldina
Дата 11.12.2012, 16:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



имхо проще сделать двумя поисками/заменами 
PM MAIL   Вверх
patap
Дата 11.12.2012, 17:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 893
Регистрация: 7.5.2005
Где: Украина, Зп

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



с помощь коллбека получилось

Код

$content = preg_replace_callback('#(?(?={\*|\*})(?:({)\*|\*(}))|{(?!t\s+|/t)([^{]+?)})#',
         create_function(
            '$match',
            'if (!empty($match[1]))
               return "{ldelim}*";
            elseif (!empty($match[2]))
               return "*{rdelim}";
            else
               return "{ldelim}".$match[3]."{rdelim}";'
         ), $content);



--------------------
На боку кобура болталась, сзади шашка отцовская звякала. 
Впереди меня все хохотало, а позади все плакало (с)
PM MAIL ICQ   Вверх
Aliance
Дата 12.12.2012, 10:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I ♥ <script>
****


Профиль
Группа: Модератор
Сообщений: 6418
Регистрация: 2.8.2004
Где: spb

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



Что-то мне подсказывает, что анонимная функция будет быстрее, чем create_function.
PM MAIL WWW ICQ Skype   Вверх
patap
Дата 12.12.2012, 12:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 893
Регистрация: 7.5.2005
Где: Украина, Зп

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



Aliance, пхп не то у нас еще)


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


 




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


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

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