Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Замена слешей внутри квадратных скобок  (Прочитано 8375 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Dracul
Помогающий

ru
Offline Offline
Пол: Мужской

« : 14-10-2009 14:46 » 

Доброе время суток. Возник следующий вопрос, есть у нас строка, внутри которой есть неизвестное количество квадратных скобок (если открываются, всегда закрываются), внутри которых есть наклонные палочки.
Вот пример такой строки:
строка начинается и идет [пример/скобок/со/слешами], и идет дальше, встречает простые/слеши/, и снова встречает [квадратные/скобки]

Вопрос: как заменить все наклонные палочки внутри квадратных скобок, не задевая наклонные палочки вне скобок?

Ясно, что регулярные выражения и в php функция preg_replace, беда только в том, что я тут очень даже не силен(((( Способ найти и заменить один такой слеш я нашел, а вот все сразу.....
« Последнее редактирование: 15-10-2009 05:15 от Sel » Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 14-10-2009 16:34 » 

Думаю, что проще будет решить так: поиск блоков [...] и через callback замена в них символов '/'.

http://ru.php.net/manual/en/function.preg-replace-callback.php

Замена на двоеточие:
Код:
<?php

$text 
= &#39;.......[aaa/bb/cc].....[dddddd/aaaa].........&#39;;

preg_replace_callback(&#39;/(\[[^\]]+\])/g&#39;, create_function(&#39;$matches&#39;, &#39;return str_replace("/", ":", $matches[0]);&#39;), $text);

echo $text;
?>

« Последнее редактирование: 14-10-2009 16:52 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Dracul
Помогающий

ru
Offline Offline
Пол: Мужской

« Ответ #2 : 15-10-2009 08:16 » 

У меня вот такой вот заработал..
Код:
<?php

$text 
= &#39;..///.....[aaa/bb/cc].....[dddddd/aaaa]...//......&#39;;

$text preg_replace_callback(&#39;/(\[[^\]]+\])/&#39;, create_function(&#39;$matches&#39;, &#39;return str_replace("/", "|", $matches[0]);&#39;), $text);

echo $text;
?>


присвоил результат замены в переменную $text, а то она выводила то что было вначале o:-) плюс php заявил что модификатор
Цитата
Warning: preg_replace_callback() [function.preg-replace-callback]: Unknown modifier 'g'

ps: большое спасибо....
Записан
Dracul
Помогающий

ru
Offline Offline
Пол: Мужской

« Ответ #3 : 15-10-2009 08:17 » 

Если кто-то рассажет как можно произвести такую замену обычным preg_replase буду очень благодарен, просто за науку
Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #4 : 16-10-2009 09:56 » 

Dracul, да, код я не потестил...

Ключик "g" - я имел в виду "global" (все). Давненько не брал php в руки - стал забывать его особенности.

Тут, imho, без вложенности не выйдет. Т.ч. с callback в самый раз.
Разве что посмотри в сторону заглядывающих утверждений. Что-то типа:
preg_replace_all('%(?<=\[[^\]]*)/%', '|', $text)
« Последнее редактирование: 16-10-2009 09:58 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Dracul
Помогающий

ru
Offline Offline
Пол: Мужской

« Ответ #5 : 26-10-2009 13:09 » new

ок)) спасибо за науку)
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines