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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> preg_replace и preg_math в одном флаконе 
:(
    Опции темы
vaddsm
  Дата 13.11.2008, 02:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Необходимо найти в строке все совпадения по паттерну, удалить их из этой строки и сохранить в другую строку. Но не нашел в php подходящей функции. Последовательным вызовом preg_match_all и preg_replace сильно не рационально. Надо за один проход сделать вот кривой пример:

Код

function preg_cut1($pattern, $subject)
{
 global $preg_matches; 
 $preg_matches = "";
 return array(preg_replace_callback($pattern,
 create_function('$matches', 'global $preg_matches; $preg_matches.= $matches[2]; return "";'), $subject), $preg_matches);   
}


Использование глобальной переменной удручает. Можно например так:

Код

function preg_cut2($pattern, $subject)
{

 $str_proc = create_function('$matches, $act = FALSE', 
 ' 
 
   static $preg_matches = ""; 
  
   if($act) return $preg_matches; 

   $preg_matches.= $matches[2];
  
   return "";    
    
 ');
 
 $rslt[0] = preg_replace_callback($pattern, $str_proc, $subject);
 $rslt[1] = $str_proc('', 1);
 
 unset($str_proc);
 
 return $rslt;   
   
}


тоже жестяной вариант.

Добавлено через 5 минут и 39 секунд
$matches[2]; в моем случае именно второй элемент нужен был, но можно задать дополнительно параметром какие именно элементы надо сохранять.
PM MAIL   Вверх
teroni
Дата 13.11.2008, 19:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Что-то типа такого...

Код

<?php
function my_func($a = false)
{
   static $values;
   if ($a == false)
      {
      $tmp = $values;
      $values = array();
      return $tmp;
      }
   $values[] = $a[0];
   return '';
}
$str = 'asaaaasddsgfgahjhaaaghghh';
$str = preg_replace_callback('/a+/', "my_func", $str);
echo $str;
print_r(my_func());
?>

Тоже кривовато, наверное, но работает.

Это сообщение отредактировал(а) teroni - 13.11.2008, 19:37
PM MAIL   Вверх
vaddsm
  Дата 14.11.2008, 02:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



teroni, ок. Я просто думал что в пхп есть специальные методы (функции) на этот случай, видимо нет. А мой вариант мне больше нравится, идея та же, но так как функция пользовательская, после ее удаления нет нужды очищать статическую переменную. + Еще нет захламляющих код однозадачных функций типа my_func.

Так или иначе спасибо.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "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.0415 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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