Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: start (target) end

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Описание: Множественная замена внутри строки
DeepVarvar Супермодератор
Отправлено: 20 Ноября, 2012 - 18:05:08
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




На самом деле все очень просто.
Есть строка, например такая:

начало 1(описание 1) 2(описание 2) 1(другое описание 1) 3(описание 3) 4(описание 4) конец

Задача: Удалить все вхождения кроме: 1(.+) и 3(.+) между метками "начало" и "конец".
Принимаются предложения только в виде регулярки для одного вызова или комбинаций из preg_replace, preg_quote, или preg_replace_callback.

Даю два плюса в карму Закатив глазки
(Добавление)
Это тоже должно проходить (как входной текст):

начало 1(описание 1) 2(описание 2) 1(другое описание 1) 3(описание 3) 4(описание 4) конец
начало 5(описание 5) 6(описание 6) 7(другое описание 7) 8(описание 8) 9(описание 9) конец
начало 10(описание 10) 1(другое описание 1) 3(описание 3) конец
 
 Top
DlTA
Отправлено: 20 Ноября, 2012 - 18:17:13
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2952
Дата рег-ции: Окт. 2010  


Помог: 53 раз(а)




а если 1(...) и 3(...) встречаются несколько раз, их все оставить или как то иначе?
 
 Top
DeepVarvar Супермодератор
Отправлено: 20 Ноября, 2012 - 18:17:50
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




да - все оставить
(Добавление)
DlTA пишет:
1(...) и 3(...)
если любые такие вхождения встречаются вне меток "начало" и "конец", их вообще нельзя трогать.
 
 Top
DlTA
Отправлено: 20 Ноября, 2012 - 19:10:04
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2952
Дата рег-ции: Окт. 2010  


Помог: 53 раз(а)




все плюсы мои

DeepVarvar забил моцк ненужной сложностью, все просто

PHP:
скопировать код в буфер обмена
  1. $text = "8(описание 8) начало 1(описание 1) 2(описание 2) 1(другое описание 1) 3(описание 3) 4(описание 4) конец 9(описание 9)";
  2.         preg_match('/начало (.+?) конец/',$text, $matches);
  3.         $outText = preg_replace('/(начало) (.+?) (конец)/','$1 '.preg_replace('/([^13]\([^\)]+\))/','', $matches[1]).'$3',$text);
  4.         var_dump($text, $outText);

(Добавление)
string '8(описание 8) начало 1(описание 1) 2(описание 2) 1(другое описание 1) 3(описание 3) 4(описание 4) конец 9(описание 9)' (length=117)
string '8(описание 8) начало 1(описание 1) 1(другое описание 1) 3(описание 3) конец 9(описание 9)' (length=90)
 
 Top
DeepVarvar Супермодератор
Отправлено: 20 Ноября, 2012 - 23:01:41
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




DlTA +1, второй попозже, сразу два не дает.
Собсно я пока домой ехал, придумал тоже, счас реализую и выложу.
(Добавление)
Однако, вхождений "начало (что-то) конец" в строке может быть любое кол-во.
К тому же, в твоем примере когда-нибудь вывалит нотайс на отсутствие $matches[1].

Во чо:
PHP:
скопировать код в буфер обмена
  1. function replacer($args) {
  2.   preg_match_all('/((1|3)\(.*\))/U', $args[1], $sub);
  3.   return str_replace($args[1], join($sub[1]), $args[0]);
  4. }
  5.  
  6. echo preg_replace_callback('/начало(.+)конец/U', 'replacer', $str);
 
 Top
DlTA
Отправлено: 21 Ноября, 2012 - 00:12:27
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2952
Дата рег-ции: Окт. 2010  


Помог: 53 раз(а)




чтоб не вывалился нотис достаточно поставить проверку на сработаность preg_match

а про множественное повторение шаблона "начало чет-там конец" изначально написано небыло
 
 Top
DeepVarvar Супермодератор
Отправлено: 21 Ноября, 2012 - 00:14:50
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




Ну, уже не важно. Вот пример. Оптимизировать еще можно?
 
 Top
DlTA
Отправлено: 21 Ноября, 2012 - 00:16:27
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2952
Дата рег-ции: Окт. 2010  


Помог: 53 раз(а)




DeepVarvar пишет:
/начало(.+)конец/
это жадная выборка,
она тебе вернет
начало ... [конец... начало ...] конец

нужно
/начало(.+?)конец/
 
 Top
DeepVarvar Супермодератор
Отправлено: 21 Ноября, 2012 - 00:17:59
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




DlTA пишет:
она тебе вернет
начало ... [конец... начало ...] конец
Отменяю же:
DeepVarvar пишет:
конец/U
 
 Top
DlTA
Отправлено: 21 Ноября, 2012 - 00:19:11
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2952
Дата рег-ции: Окт. 2010  


Помог: 53 раз(а)




кстати, в значения
1 3 в метода будут глобально передаваться?
 
 Top
DeepVarvar Супермодератор
Отправлено: 21 Ноября, 2012 - 00:19:47
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




Нет, они статичны.
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Регулярные выражения »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB