Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум Регулярные Выражения

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Замена символа с условием
 
 автор: zoomz   (26.08.2009 в 14:01)   письмо автору
 
 

Есть сторока:

$str = "substring(doc_contents,1,50), ';%' ";


Возможно ли с помощь preg_replace или каким другим методом заменить все те запятые которые не находятся между скобками и между кавычками, на скажем знак + ? То есть в данном случае это будет запятая после скобки, может кто-нибудь мог бы поделится решением?

  Ответить  
 
 автор: heed   (26.08.2009 в 19:55)   письмо автору
 
   для: zoomz   (26.08.2009 в 14:01)
 

возможно , но только с ощутимым увеличением времени генерации результата
, и чем продуманнее все возможные варианты , тем больше потребуется времени
например вот простейших пару выражений , (в обоих случаях приходится дополнительно обрабатывать результаты)
не учитывается что в скобках может быть ещё закрывающая скобка , но а кавычках , и её не нужно будет учитывать как закрывающую
, не учитывается что в кавычках могут быть экранированные кавычки
,и что скобки могут быть вложенными
<pre><?
$str 
"substring(doc_contents,1,50), ';%' 
substring(doc_contents,'50',\"50\"), \";%\" 
,,,,"
;


$p1 '@\G([^\("\']*) # то где заменяется
($|([\("\']) #начало ненужного
(?(?<!\()
 (?:[^"\']*(?!\3).)*\3 # если была не скобка
|[^\)]*\))# если была скобка
)
@xe'
;

$p2 '#\G\([^\)]*\)|"[^"]*"|\'[^\']*\'|([^\("\'])+#';

/*
preg_match_all($p1, $str, $out, 2);
print_r($out);
preg_match_all($p2, $str, $out, 2);
print_r($out);
*/

echo preg_replace($p1'str_replace(",", "+", \'$1\') .\'$2\''$str) ."\n\n\n";

echo 
preg_replace($p2 .'e'/*модификатор /e */'(\'$1\')? str_replace(",", "+", \'$0\'): \'$0\''$str) ."\n\n\n";

function 
zzz($m){
return (isset(
$m[1]))? str_replace(",""+"$m[0]): $m[0];
}
echo 
preg_replace_callback($p2'zzz'$str) ."\n\n\n";
?>

на втором выражении третьим replace показано почему ещё лучше применять callback-функцию чем модификатор '/e'

  Ответить  
 
 автор: zoomz   (27.08.2009 в 13:35)   письмо автору
 
   для: heed   (26.08.2009 в 19:55)
 

Спасибо огромное, теперь ясен тпринцип работы, да и еще 2умя способами!

  Ответить  
 
 автор: heed (OperaMini)   (27.08.2009 в 14:24)
 
   для: zoomz   (27.08.2009 в 13:35)
 

Ещё иногда удобне использовать preg_split()
в режиме когда разделители тоже сладываются в массив.
И в цикле анализировать элементы этого массива.
Но повторюсь насчёт времени.

  Ответить  
 
 автор: zoomz   (27.08.2009 в 15:18)   письмо автору
 
   для: heed (OperaMini)   (27.08.2009 в 14:24)
 

Спасибо - возьму на вооружение!

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования