|
|
|
| доброе время суток.
текст:
текст текст текст текст текст текст
текст текст текст
текст текст текст текст
(текст текст
текст текст текст текст
)
текст (текст
текст )
|
как можно с помощью регулярного выражения удалить в тексте все переносы строк, но только вне круглых скобок? | |
|
|
|
|
автор: ..... (16.08.2010 в 03:19) |
|
|
для: rusty
(15.08.2010 в 09:56)
| | >с помощью регулярного выражения
всмысле с помощью php preg_функций ?
оптимальнее наверное искать типа \([^\(]*\)|[^\(] , т.е то что нужно и то что не нужно , и в callback-функции preg_replace_callback юзать например str_replace() применительно к тому где нужна замена.
или обработать пары подсовпадений типа \G([^\(]*)(\([^\)]*\)?)* как $1,$2
или искать незехватывая ненужное подсовпадение намного некрасивее
// плюс варианты приоритетов идущих подряд открывающих/закрывающих скобок, и экранирование/заковычивание | |
|
|
|
|
|
|
|
для: .....
(16.08.2010 в 03:19)
| | т.е. за один заход не получится сделать? | |
|
|
|
|
автор: ..... (16.08.2010 в 19:18) |
|
|
для: rusty
(16.08.2010 в 18:09)
| | >один заход
Всмысле похоже на третий вариант ?
<?php
header('content-type: text/plain');
$txt='текст
> текст
текст
текст
<
<<<
<
текст текст
>
>>>
>
текст
<текст
текст>
.
.
.
';
?>
---------- 1 ---------
<?
function crlfstrip( $arr ) {
return (isset($arr[1])) ? $arr[0]
: str_replace(array("\r", "\n"), ' ', $arr[0]);
}
echo preg_replace_callback( '#\G(<)[^>]++>|[^<]++#', 'crlfstrip', $txt);
?>
---------- 2 ---------
<?
echo preg_replace( '#\G([^<]*)(<[^>]*>?)*#e'
, 'str_replace(array("\r", "\n"), " ", \'$1\') . \'$2\'', $txt);
?>
---------- 3 ---------
<?
echo preg_replace( '#[\r\n]++(?=[^>]*(?:<|$))#', ' ', $txt);
// возможно самый медленый при определённых сочетаниях текста в строках
?>
|
не оптимизировал шаблоны (лениво), и вариантов есть ещё | |
|
|
|
|
|
|
|
для: .....
(16.08.2010 в 19:18)
| | спасибо! | |
|
|
|