Как заменить различные стили новой строки в PHP самым умным способом?

У меня есть текст, который может иметь разные стили новой строки. Я хочу заменить все новые строки '\ r \ n', '\ n', '\ r' той же новой строкой (в данном случае \ r \ n).

Какой самый быстрый способ сделать это? Мое текущее решение выглядит так:

$sNicetext = str_replace("\r\n",'%%%%somthing%%%%', $sNicetext); $sNicetext = str_replace(array("\r","\n"),array("\r\n","\r\n"), $sNicetext); $sNicetext = str_replace('%%%%somthing%%%%',"\r\n", $sNicetext); 

Проблема в том, что вы не можете сделать это с одной заменой, потому что \ r \ n будет дублироваться в \ r \ n \ r \ n.

Спасибо за помощь!

Related of "Как заменить различные стили новой строки в PHP самым умным способом?"

 $string = preg_replace('~\R~u', "\r\n", $string); 

Если вы не хотите заменять все строки новой строки Unicode, но только CRLF, используйте:

 $string = preg_replace('~(*BSR_ANYCRLF)\R~', "\r\n", $string); 

\R соответствует этим новым строкам, u является модификатором для обработки входной строки как UTF-8.


Из документов PCRE :

Что \R соответствует

По умолчанию последовательность \ R в шаблоне соответствует любой последовательности строк Unicode, независимо от того, что было выбрано в качестве последовательности окончания строки. Если вы укажете

  --enable-bsr-anycrlf 

по умолчанию изменяется так, что \ R соответствует только CR, LF или CRLF. Независимо от того, что выбрано при создании PCRE, можно переопределить при вызове функций библиотеки.

а также

Последовательности новой строки

Вне класса символов по умолчанию escape-последовательность \ R соответствует любой последовательности строк Unicode. В режиме без UTF-8 \ R эквивалентно следующему:

  (?>\r\n|\n|\x0b|\f|\r|\x85) 

Это пример «атомной группы», подробности которой приведены ниже. Эта конкретная группа соответствует либо двухсимвольной последовательности CR, за которой следует LF, либо одному из одиночных символов LF (linefeed, U + 000A), VT (вертикальная вкладка, U + 000B), FF (formfeed, U + 000C), CR (возврат каретки, U + 000D) или NEL (следующая строка, U + 0085). Двухсимвольная последовательность рассматривается как единое целое, которое нельзя разделить.

В режиме UTF-8 добавляются два дополнительных символа с кодовыми точками больше 255: LS (разделитель строк, U + 2028) и PS (разделитель абзацев, U + 2029). Поддержка символов символов Unicode не требуется для распознавания этих символов.

Можно ограничить \ R, чтобы он соответствовал только CR, LF или CRLF (вместо полного набора окончаний строки Unicode), установив параметр PCRE_BSR_ANYCRLF либо во время компиляции, либо когда шаблон сопоставлен. (BSR является сокращением для «обратного слэша R».) Это может быть сделано по умолчанию при создании PCRE; если это так, другое поведение можно запросить с помощью параметра PCRE_BSR_UNICODE. Также можно указать эти параметры, запустив строку шаблона с помощью одной из следующих последовательностей:

  (*BSR_ANYCRLF) CR, LF, or CRLF only (*BSR_UNICODE) any Unicode newline sequence 

Они переопределяют значение по умолчанию и параметры, заданные для pcre_compile () или pcre_compile2 (), но они могут быть переопределены параметрами, заданными для pcre_exec () или pcre_dfa_exec (). Обратите внимание, что эти специальные настройки, которые не совместимы с Perl, распознаются только в самом начале шаблона и что они должны быть в верхнем регистре. Если присутствует более одного из них, используется последний. Их можно сочетать с изменением конвенции новой строки; например, шаблон может начинаться с:

  (*ANY)(*BSR_ANYCRLF) 

Их также можно комбинировать с специальными последовательностями (* UTF8) или (* UCP). Внутри класса символов \ R рассматривается как непризнанная escape-последовательность и поэтому соответствует букве «R» по умолчанию, но вызывает ошибку, если установлен PCRE_EXTRA.

Для нормализации новых строк я всегда использую:

 $str = preg_replace('~\r\n?~', "\n", $str); 

Он заменяет старые символы Mac ( \r ) и Windows ( \r\n ) эквивалентом Unix ( \n ).

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

Как насчет

 $sNicetext = preg_replace('/\r\n|\r|\n/', "\r\n", $sNicetext); 

я думаю, что самый умный / простой способ конвертировать в CRLF:

 $output = str_replace("\n", "\r\n", str_replace("\r", '', $input)); 

конвертировать только в LF:

 $output = str_replace("\r", '', $input); 

это намного проще, чем регулярные выражения.