|
|
|
| Есть сторока:
$str = "substring(doc_contents,1,50), ';%' ";
Возможно ли с помощь preg_replace или каким другим методом заменить все те запятые которые не находятся между скобками и между кавычками, на скажем знак + ? То есть в данном случае это будет запятая после скобки, может кто-нибудь мог бы поделится решением? | |
|
|
|
|
|
|
|
для: 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' | |
|
|
|
|
|
|
|
для: heed
(26.08.2009 в 19:55)
| | Спасибо огромное, теперь ясен тпринцип работы, да и еще 2умя способами! | |
|
|
|
|
автор: heed (OperaMini) (27.08.2009 в 14:24) |
|
|
для: zoomz
(27.08.2009 в 13:35)
| | Ещё иногда удобне использовать preg_split()
в режиме когда разделители тоже сладываются в массив.
И в цикле анализировать элементы этого массива.
Но повторюсь насчёт времени. | |
|
|
|
|
|
|
|
для: heed (OperaMini)
(27.08.2009 в 14:24)
| | Спасибо - возьму на вооружение! | |
|
|
|