Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Замена \r, \n, \n\r на \r\n

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
Brothersssddsss
Отправлено: 03 Сентября, 2010 - 19:52:55
Post Id


Новичок


Покинул форум
Сообщений всего: 16
Дата рег-ции: Март 2010  


Помог: 0 раз(а)




Здравствуйте! Нужна помощь в регулярном выражении…


Короче нужно заменять \r, \n, \n\r на \r\n.

Нужно чтобы, к примеру, в этой строке «\r\n\r\n\r\n\r\n» он НЕ заменял, потому что там все \r\n парные, а если \r без \n то заменить \r на \r\n, так же если \n без \r то заменить \n на \r\n.

Примеры должных результатов:

«\nтекст» - заменить.
«\n\rтекст» - заменить.
«текст\nтекст» - заменить.
«текст\n» - заменить.
«\r\n\r\n\r\n» - НЕ заменять (там все парные)
«\n\n\n\r\n\r\n\r» - заменить 3 первых \n и последнюю \r (или по другому…главное чтобы было 6 штук \r\n)

Ну, вроде ясно объяснил. Помогите, пожалуйста…
 
 Top
Uchkuma
Отправлено: 03 Сентября, 2010 - 21:17:12
Post Id



Участник


Покинул форум
Сообщений всего: 1539
Дата рег-ции: Март 2010  
Откуда: Киров


Помог: 6 раз(а)




Ну вот так можно:
PHP:
скопировать код в буфер обмена
  1. $newtext = preg_replace('/(?<!\\r)\\n|\\r(?!\\n)/', '\r\n', $text);
Единственное - \n\r будет заменено на \r\n\r\n, а не на \r\n.
 
 Top
Brothersssddsss
Отправлено: 04 Сентября, 2010 - 00:49:30
Post Id


Новичок


Покинул форум
Сообщений всего: 16
Дата рег-ции: Март 2010  


Помог: 0 раз(а)




Спасибо. У кого нибудь есть ещё решения? предлагайте...


Отредактировано модератором: movEAX, 04 Сентября, 2010 - 01:57:00
 
 Top
movEAX
Отправлено: 04 Сентября, 2010 - 01:54:46
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 750
Дата рег-ции: Авг. 2009  


Помог: 16 раз(а)




Можно так еще попробовать:
PHP:
скопировать код в буфер обмена
  1. $patterns = array (
  2.     '@(?<!\\r)\\n\\r(?!\\n)@',
  3.     '@(?<!\\r)\\n|\\r(?!\\n)@'
  4. );
  5. $newText = preg_replace($patterns, "\r\n", $text);


Сначала заменяем все \n\r, потом добиваем все что осталось


-----
армия.. самое убогое место
 
 Top
JustUserR
Отправлено: 04 Сентября, 2010 - 12:01:54
Post Id



Активный участник


Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009  


Помог: 17 раз(а)




Brothersssddsss Для реализации приведенной вами задачи по приведению все встречаюихся в тексте символов новой строки и возврата каретки в единую форму можно использовать такую схему - вначале вы заменяете все вхождения символов \r и \n на значение \r\n с помощью функции трансляции для избежания повтороного прохода - далее вы производите замену подстроки \n\r на \r\n и потом удаляете все повторяющиеся переводы строки путем повторной замены \r\n\r\n на одиночное значение \r\n


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
Uchkuma
Отправлено: 04 Сентября, 2010 - 14:55:28
Post Id



Участник


Покинул форум
Сообщений всего: 1539
Дата рег-ции: Март 2010  
Откуда: Киров


Помог: 6 раз(а)




movEAX, твой вариант не покатит. Строку "\r\n\r\n\r\n\r\n", которую вообще бы трогать не надо, он превратит сначала в "\r\r\n\r\n\r\n\n", а потом в "\r\n\r\n\r\n\r\n\r\n".
В итоге получили лишние преобразования и лишний "\r\n".
 
 Top
cHameleon
Отправлено: 04 Сентября, 2010 - 15:19:33
Post Id



Гость


Покинул форум
Сообщений всего: 107
Дата рег-ции: Янв. 2010  


Помог: 0 раз(а)




PHP:
скопировать код в буфер обмена
  1. $mass = array("\nтекст",
  2.   "\n\rтекст",
  3.   "текст\nтекст",
  4.   "текст\n",
  5.   "\r\n\r\n\r\n",
  6.   "\n\n\n\r\n\r\n\r");
  7. $mass = preg_replace('/(\r\n)/', '[test1]', $mass);
  8. $mass = preg_replace('/(\n\r)/', '[test2]', $mass);
  9. $mass = preg_replace('/\\n|\\r/', '\r\n', $mass);
  10. $mass = preg_replace('/\[test1\]/', '\r\n', $mass);
  11. $mass = preg_replace('/\[test2\]/', '\r\n', $mass);
  12. print_r($mass);

наверное после таких извращений я автоматически становлюсь быдлокодером Радость


-----
берём notepad++ и творим пэхэпэ-мир
 
 Top
Uchkuma
Отправлено: 04 Сентября, 2010 - 15:59:11
Post Id



Участник


Покинул форум
Сообщений всего: 1539
Дата рег-ции: Март 2010  
Откуда: Киров


Помог: 6 раз(а)




cHameleon, креативный подход Улыбка!
Brothersssddsss пишет:
Спасибо. У кого нибудь есть ещё решения? предлагайте...
А какое решение вы еще ожидаете? Самое простое и правильное вам уже выдали.
 
 Top
movEAX
Отправлено: 04 Сентября, 2010 - 16:09:43
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 750
Дата рег-ции: Авг. 2009  


Помог: 16 раз(а)




Uchkuma пишет:
movEAX, твой вариант не покатит. Строку "\r\n\r\n\r\n\r\n", которую вообще бы трогать не надо, он превратит сначала в "\r\r\n\r\n\r\n\n", а потом в "\r\n\r\n\r\n\r\n\r\n".
В итоге получили лишние преобразования и лишний "\r\n".

PHP:
скопировать код в буфер обмена
  1.  
  2. $text = "rnrnrnrn";
  3. $patterns = array (
  4.     '@(?<!r)nr(?!n)@',
  5.     '@(?<!r)n|r(?!n)@'
  6.  );
  7. echo $newText = preg_replace($patterns, "rn", $text);

На выходе rnrnrnrn, сам проверь


-----
армия.. самое убогое место
 
 Top
Uchkuma
Отправлено: 04 Сентября, 2010 - 17:42:27
Post Id



Участник


Покинул форум
Сообщений всего: 1539
Дата рег-ции: Март 2010  
Откуда: Киров


Помог: 6 раз(а)




movEAX, да, шаблон просто бегло просмотрел )
 
 Top
JustUserR
Отправлено: 05 Сентября, 2010 - 13:17:33
Post Id



Активный участник


Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009  


Помог: 17 раз(а)




cHameleon пишет:
Наверное после таких извращений я автоматически становлюсь быдлокодером
Приведенная вами схема решения после внесения некоторых изменения становится достаточно оптимальной - суть заключается в том что путем использования спецаильных подстрок test1 и test2 на самом деле вы осуществляется дифференциацию уже проведенных замен и тех которые еще не были проведены - поэтому если произвести некотрое предварительное кодирование строки и использовать более короткие замещающие строки то такой вариант становится достаточно оптимальным
Кроме того для более прямого решения можно использовать функцию strtr - по сути она выполняете такой же по результату алгоритм в результате которого все двойные замены блокируются - даже если в результате последовательного проведения поиска вхождение предлагающий одинаковый результат


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
CenapaTop
Отправлено: 05 Сентября, 2010 - 15:09:23
Post Id



Частый гость


Покинул форум
Сообщений всего: 166
Дата рег-ции: Авг. 2009  


Помог: 1 раз(а)




PHP:
скопировать код в буфер обмена
  1. $str = '\nтекст \n\rтекст текст\nтекст текст\n \r\n\r\n\r\n \n\n\n\r\n\r\n\r';
  2.  
  3. echo $str.'<BR>';
  4.  
  5. $new_str = str_replace('#', '\r\n', str_replace(array('\r\n', '\n\r', '\n', '\r'), '#', $str));
  6.  
  7. echo $new_str;
 
 Top
JustUserR
Отправлено: 06 Сентября, 2010 - 17:36:21
Post Id



Активный участник


Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009  


Помог: 17 раз(а)




CenapaTop Для более точного решения исходной задачи с сохранением числа вхождений перевода строки необходимо внести в приведенный вами пример несколько модификаций - в частности заместо функции str_replace можно использовать функцию трансляци strtr которая позволяет производить все замены в чистом виде - вне зависимости от порядка их следования в тексте и возможности наложения - такой подход должен гарантировать что к примеру все замены \n\r будут произведены полностью если это возможно Кроме того необходимо обеспечит отсутсивие символа # в оригинальном тексте - что может решаться путем двухпроходного предварительного шифрования


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
Brothersssddsss
Отправлено: 10 Сентября, 2010 - 22:11:40
Post Id


Новичок


Покинул форум
Сообщений всего: 16
Дата рег-ции: Март 2010  


Помог: 0 раз(а)




Всем огромное спасибо!!!!
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Регулярные выражения »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB