У меня есть текст, который может иметь разные стили новой строки. Я хочу заменить все новые строки '\ 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.
Спасибо за помощь!
$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);
это намного проще, чем регулярные выражения.