regexp нужна помощь

berkut

Новичок
regexp нужна помощь

помогите написать регулярное выражение, для вырезания лишних переводов строки.
Между не пустыми строками(строками содержащими \r\n или пробельные символы) должно быть не более 1 пустой строки. Например:
Код:
1 line¶
¶
¶••
4th line
где • - это пробел или таб, а ¶ - перевод строки
нужно получить
Код:
1 line¶
¶
3rd line
что-то соорудил, но ЭТО не хочет работать
PHP:
$c = preg_replace('#^ *$#', '', $c);
echo preg_replace("#(\r?\n)+#s", "\r\n", $c);
 

Wicked

Новичок
preg_replace("/(\r\n)\s*(\r\n)/", "\r\n\r\n", $str);

смысл: если есть 2 перевода строк (win), между которыми есть любые спэйсеры, то эти спэйсеры убираем, и оставляем только эти 2 перевода строк.
 

berkut

Новичок
Wicked спасибо, единственный рабочий вариант

-~{}~ 26.07.06 11:06:

Wicked можешь объяснить, получается в твоём варианте \s* съедает ещё и лишние \r\n?
 

Фанат

oncle terrible
Команда форума
этот вопрос надо задавать не Wicked, а документации.
 

avenger_msoft

Новичок
Фанат
Еще скажи, что он не работает... да временами, может работать не на тех участках, на которых нужно. Но если у автора вопроса, нет больше двух пробельных символов в тексте, а есть только в конце строк, то все будет ок.
 

Фанат

oncle terrible
Команда форума
avenger_msoft
заменять два пробела на два перевода строки - это да, именно то, что человек спрашивал, ага.
ума, блин, палата
 

avenger_msoft

Новичок
Фанат
У него в вопросе не сказано, что в тексте так же может встречатся 2-а пробельных символа.
Каков вопрос, таков и ответ.
 

Фанат

oncle terrible
Команда форума
ну ты тупоооой.
у него сказано, что вырезать надо лишние переводы строки.
а не лишние табуляции.
 

sakon

П..и.н..ок
avenger_msoft
Ты вопросы читаешь? Или ты самый "умный"?
"содержащими \r\n или пробельные символы"
 

avenger_msoft

Новичок
Автор оригинала: Фанат
ну ты тупоооой.
у него сказано, что вырезать надо лишние переводы строки.
а не лишние табуляции.
Автор оригинала: berkut
где • - это пробел или таб, а ¶ - перевод строки
Попрошу без оскарблений, сам такой пародистый.
 

berkut

Новичок
по идее, вариант для всех типов перевода строк
PHP:
preg_replace("/(\r\n|\n|\r)\s*(\r\n|\n|\r)/", "\\1\\1", $c);
 

avenger_msoft

Новичок
Автор оригинала: sakon
avenger_msoft
Ты вопросы читаешь? Или ты самый "умный"?
"содержащими \r\n или пробельные символы"
Когда я говорю, что в тексте не может встречатся 2-а пробельных символа, я имею в виду такую ситуацию:

1 нормализированная строка. \r\n\s\t
\r\n\s\t
2 нормализированная строка. \r\n\s\t
\r\n\s\t
3 нормализированная строка. \r\n\s\t
4 нормализированная строка. \r\n\s\t

Нормализированная строка - это строка, в который между словами нет символов перевода строки, между словами не более 1-го пробела и знака табуляции.

В этом случае мое регулярное выражение будет работать.
Я исходил из того, что у автора вопроса нормализированные строки.
 

Wicked

Новичок
avenger_msoft
а еще можно предъявить требование, что в строке вообще не должно быть проблелов, и тогда можно заменять даже не \s{2, } а просто \s+. И будет вообще красота.
 
Сверху