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
Форумы портала PHP.SU :: Версия для печати :: Замена \r, \n, \n\r на \r\n
Форумы портала PHP.SU » PHP » Регулярные выражения » Замена \r, \n, \n\r на \r\n

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

1. Brothersssddsss - 03 Сентября, 2010 - 19:52:55 - перейти к сообщению
Здравствуйте! Нужна помощь в регулярном выражении…


Короче нужно заменять \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)

Ну, вроде ясно объяснил. Помогите, пожалуйста…
2. Uchkuma - 03 Сентября, 2010 - 21:17:12 - перейти к сообщению
Ну вот так можно:
PHP:
скопировать код в буфер обмена
  1. $newtext = preg_replace('/(?<!\\r)\\n|\\r(?!\\n)/', '\r\n', $text);
Единственное - \n\r будет заменено на \r\n\r\n, а не на \r\n.
3. Brothersssddsss - 04 Сентября, 2010 - 00:49:30 - перейти к сообщению
Спасибо. У кого нибудь есть ещё решения? предлагайте...
4. movEAX - 04 Сентября, 2010 - 01:54:46 - перейти к сообщению
Можно так еще попробовать:
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, потом добиваем все что осталось
5. JustUserR - 04 Сентября, 2010 - 12:01:54 - перейти к сообщению
Brothersssddsss Для реализации приведенной вами задачи по приведению все встречаюихся в тексте символов новой строки и возврата каретки в единую форму можно использовать такую схему - вначале вы заменяете все вхождения символов \r и \n на значение \r\n с помощью функции трансляции для избежания повтороного прохода - далее вы производите замену подстроки \n\r на \r\n и потом удаляете все повторяющиеся переводы строки путем повторной замены \r\n\r\n на одиночное значение \r\n
6. Uchkuma - 04 Сентября, 2010 - 14:55:28 - перейти к сообщению
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".
7. cHameleon - 04 Сентября, 2010 - 15:19:33 - перейти к сообщению
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);

наверное после таких извращений я автоматически становлюсь быдлокодером Радость
8. Uchkuma - 04 Сентября, 2010 - 15:59:11 - перейти к сообщению
cHameleon, креативный подход Улыбка!
Brothersssddsss пишет:
Спасибо. У кого нибудь есть ещё решения? предлагайте...
А какое решение вы еще ожидаете? Самое простое и правильное вам уже выдали.
9. movEAX - 04 Сентября, 2010 - 16:09:43 - перейти к сообщению
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, сам проверь
10. Uchkuma - 04 Сентября, 2010 - 17:42:27 - перейти к сообщению
movEAX, да, шаблон просто бегло просмотрел )
11. JustUserR - 05 Сентября, 2010 - 13:17:33 - перейти к сообщению
cHameleon пишет:
Наверное после таких извращений я автоматически становлюсь быдлокодером
Приведенная вами схема решения после внесения некоторых изменения становится достаточно оптимальной - суть заключается в том что путем использования спецаильных подстрок test1 и test2 на самом деле вы осуществляется дифференциацию уже проведенных замен и тех которые еще не были проведены - поэтому если произвести некотрое предварительное кодирование строки и использовать более короткие замещающие строки то такой вариант становится достаточно оптимальным
Кроме того для более прямого решения можно использовать функцию strtr - по сути она выполняете такой же по результату алгоритм в результате которого все двойные замены блокируются - даже если в результате последовательного проведения поиска вхождение предлагающий одинаковый результат
12. CenapaTop - 05 Сентября, 2010 - 15:09:23 - перейти к сообщению
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;
13. JustUserR - 06 Сентября, 2010 - 17:36:21 - перейти к сообщению
CenapaTop Для более точного решения исходной задачи с сохранением числа вхождений перевода строки необходимо внести в приведенный вами пример несколько модификаций - в частности заместо функции str_replace можно использовать функцию трансляци strtr которая позволяет производить все замены в чистом виде - вне зависимости от порядка их следования в тексте и возможности наложения - такой подход должен гарантировать что к примеру все замены \n\r будут произведены полностью если это возможно Кроме того необходимо обеспечит отсутсивие символа # в оригинальном тексте - что может решаться путем двухпроходного предварительного шифрования
14. Brothersssddsss - 10 Сентября, 2010 - 22:11:40 - перейти к сообщению
Всем огромное спасибо!!!!

 

Powered by ExBB FM 1.0 RC1