[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: как распознать перенос строк и табуляцию в строке?
totje
насколько мне уже известно, перенос строки - \n, табуляция - \t
но в случае с пробелом замена 1 и более пробела подряд работает

$str= preg_replace('/(\s+)/i', ' ', $str);

а вот

$str= preg_replace('/(\t+)/i', ' ', $str);
$str= preg_replace('/(\n+)/i', ' ', $str);

нет.
что подскажите?
и как правильно записать шаблон замены?



Спустя 4 часа, 3 минуты, 30 секунд (13.01.2011 - 18:21) totje написал(а):
неужели никто не может подсказать?

Спустя 10 минут, 24 секунды (13.01.2011 - 18:31) inpost написал(а):
/ius (в твоём случае это s), тогда можно /s охватывать одновременно как пробелы, так и перенос строки и табуляцию.

Спустя 5 минут, 34 секунды (13.01.2011 - 18:37) DySprozin написал(а):
totje
не \n, а \r\n (;

$str= preg_replace('/([\r\n]+)/i', ' ', $str);

Спустя 21 минута, 3 секунды (13.01.2011 - 18:58) totje написал(а):
Цитата
$str= preg_replace('/([\r\n]+)/i', ' ', $str);

спасибо, но не работает(
inpost
ну мне все под одно не надо.
нужно, чтобы 2 и более пробела заменялись одним, 2 и более переноса - одним переносом итд.

Спустя 19 часов, 29 секунд (14.01.2011 - 13:59) totje написал(а):
посоветуйте еще что-нибудь или поделитесь ссылкой на какой-нибудь урок типа "не даем флудерам постить одни переносы строк". сколько гуглил, ничего не нашел путного.

Спустя 1 час, 43 минуты, 27 секунд (14.01.2011 - 15:42) inpost написал(а):
totje
(/s){2,}

Спустя 5 часов, 15 минут, 1 секунда (14.01.2011 - 20:57) totje написал(а):
inpost
Warning: preg_replace() [function.preg-replace]: Unknown modifier ')' in этой строке
строка такая:

$str= preg_replace('/(/s){2,}/i', ' ', $str);

как правильно записать полностью?
да и вообще, пробелы проблем давно не представляют, что делать с переносом строк?
ни на \r\n, ни на \r, ни на \n не реагирует выражение..
пытаюсь так:

$str= preg_replace('/(\r+)/i', ' ', $str);
$str= preg_replace('/(\r\n+)/i', ' ', $str);
$str= preg_replace('/(\n+)/i', ' ', $str);

Спустя 9 минут, 5 секунд (14.01.2011 - 21:06) inpost написал(а):
я же написал:
/[/s]{2,}/s (МОДИФИКАТОР s), читай про него...

Спустя 1 час, 11 минут, 52 секунды (14.01.2011 - 22:18) totje написал(а):
да я же прошу показать, как правильно вставить это условие в ф-цию еще с самого первого поста..
опять Warning: preg_replace() [function.preg-replace]: Unknown modifier ']' in
в строке

$str= preg_replace('/[/s]{2,}/s', '123', $str);

как правильно записать то??

Спустя 1 час, 57 минут, 51 секунда (15.01.2011 - 00:16) inpost написал(а):
Используй обрамление функции так: || или ##
А ещё лучше зайти сюда и посмотреть, как правильно этот мета-символ пишется: http://irbis-team.com/15/20/3

Спустя 8 часов, 37 минут, 30 секунд (15.01.2011 - 08:53) totje написал(а):
ну за их урок спасибо, но проблема все еще осталась с самим распознованием символов. или вообще тут уже дело в их существовании?

$str= preg_replace('#[\r\n]+#s', ' ', $str); // не работает
$str= preg_replace('#[\n]+#s', ' ', $str); // не работает
$str= preg_replace('#[\r]+#s', ' ', $str); // не работает
$str= preg_replace('#[\s]+#s', ' ', $str); // работает, видит все пробелы идущие подряд>1, заменят их одним


в бд посты сохраняются именно так как они были в textarea, уже с видимыми переносами, а не в строку с \r\n итд. это нормально? может быть, проблема в этом?

$str= str_replace('\r\n\r\n', '\r\n', $str);

строковая ф-ция, кстати, все находит и заменяет.. в данном случае 2 переноса на 1

Спустя 1 день, 5 минут, 8 секунд (16.01.2011 - 08:58) totje написал(а):
$str= preg_replace('#[/s]+#s', ' ', $str);

тоже не работает.

кто-нибудь имеет возможность предоставить в полном виде ф-цию, которая бы заменяла 2 и более переноса строк одним, или это так сложно?)

Спустя 1 час, 42 минуты (16.01.2011 - 10:40) twin написал(а):
$str= preg_replace('#[\s]{2,}#s', ' ', $str);

Спустя 25 минут, 56 секунд (16.01.2011 - 11:06) totje написал(а):
twin
ну вот ведь выше я писал:

$str= preg_replace('#[\s]+#s', ' ', $str); // работает, видит все пробелы идущие подряд>1, заменят их одним

с пробелами все нормально работает, с переносом строк - нет

Спустя 15 минут, 20 секунд (16.01.2011 - 11:22) Snus написал(а):
totje
Зачем тебе несколько подряд идущих пробелов убирать preg_match'ем? Попробуй
$str = trim($str);

Спустя 23 минуты, 4 секунды (16.01.2011 - 11:45) totje написал(а):
Snus
а зачем нужна строка вида "2 %кучапробелов% 2"?
трим, насколько мне известно, обрезает пробелы по краям, к тому же, он и так включен в обработку постов.
и я хз-й раз повторюсь - ПРОБЕЛЫ меня не волнуют, меня волнуют ПЕРЕНОСЫ СТРОК, чтобы не было на выходе строк вида:
"








ололо, я сломаю ваш скролл
"

Спустя 5 минут, 36 секунд (16.01.2011 - 11:50) Snus написал(а):
totje
Делай проверку

if(!empty($str)){
...
}

Спустя 1 час, 10 минут, 24 секунды (16.01.2011 - 13:01) totje написал(а):
Snus
такая проверка тоже имеется
да и куча переносов + к тому же с символом в конце явно не сойдут за пустую строку)

Спустя 2 минуты, 50 секунд (16.01.2011 - 13:04) Snus написал(а):
totje
$str = trim($str);
if(!empty($str)){
...
}

Спустя 1 час, 9 минут, 40 секунд (16.01.2011 - 14:13) totje написал(а):
Snus
ну а если подставить туда что-то типа
"
1




1
"
то ведь такая строка и пройдет, разве нет?

Спустя 1 минута, 45 секунд (16.01.2011 - 14:15) Snus написал(а):
totje
Так ты построчно читай. И выведет тебе он:
1
1

Спустя 23 минуты, 32 секунды (16.01.2011 - 14:39) totje написал(а):
Snus
вот тут я что-то упустил/поканезнаю, видимо, так что можно поподробнее про "построчно читай"?) этокак?

Спустя 12 минут, 13 секунд (16.01.2011 - 14:51) Snus написал(а):
totje
Ты откуда эти данные берешь? Из файла текстового или БД?

Спустя 5 часов, 13 минут, 58 секунд (16.01.2011 - 20:05) totje написал(а):
Snus
из базы..

Спустя 6 минут, 9 секунд (16.01.2011 - 20:11) Snus написал(а):
К примеру так:
$exp = explode("\n", $str);

foreach($exp as $line){

}

Спустя 22 минуты, 47 секунд (16.01.2011 - 20:34) totje написал(а):
Snus
да вот к циклам не очень хотелось прибегать..
я правильно построил эту ф-цию? а то сейчас не здоровится и как-то не особо вникается..

$exp= explode("\r\n", $str);
$str= '';
foreach($exp as $line){
$str= $str.'PERENOSSTROKI'.$line;
}
echo $str;

при посте чего-то типа:
"111


222"
результат вида:
"PERENOSSTROKI111


222"
иными словами - не работает. с \n тоже самое.

Спустя 1 минута, 58 секунд (16.01.2011 - 20:36) inpost написал(а):
totje
Зачем тебе регулярка, если ты зарание знаешь, что собираешься вырезать? Используй str_replace!

Snus
Trim только в начале и в конце убирает, а по смыслу надо убрать в середине!

Спустя 4 минуты, 30 секунд (16.01.2011 - 20:40) totje написал(а):
inpost
да это пока единственный выход, но там ведь нельзя так гибко настроить шаблон(или разве можно??), а учитывая то, что допустимый размер поста 1000символов, то это жесть получится типа:

<...>
$str= str_replace('\r\n\r\n\r\n\r\n\r\n\r\n', '\r\n\r\n\r\n\r\n', $str);
$str= str_replace('\r\n\r\n\r\n\r\n', '\r\n\r\n', $str);
$str= str_replace('\r\n\r\n', '\r\n', $str);

или в цикл, что все равно.
для меня загадка, почему эта строковая ф-ция определяет перенос, а никакой explode, preg_replace или даже тупо сравнение каждого символа с переносом - нет.

Спустя 53 минуты, 47 секунд (16.01.2011 - 21:34) Snus написал(а):
totje
А если так
$str = str_replace(array('  ',"\t"), array(' ',' '), $str);

Спустя 11 часов, 7 минут, 4 секунды (17.01.2011 - 08:41) totje написал(а):
Snus
неа, но вот так:

$str= str_replace(array('\r\n\r\n\r\n\r\n\r\n\r\n','\r\n\r\n\r\n\r\n\r\n','\r\n\r\n\r\n\r\n','\r\n\r\n\r\n','\r\n\r\n'), array('\r\n','\r\n','\r\n','\r\n','\r\n'), $str);

сойдет, думаю:)
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.