40

我有一个可能有不同换行样式的文本。我想用相同的换行符替换所有换行符 '\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 。

感谢您的帮助!

4

5 回答 5

100
$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 时选择的任何内容。

换行序列

在字符类之外,默认情况下,转义序列 \R 匹配任何 Unicode 换行符序列。在非 UTF-8 模式下,\R 等价于以下内容:

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

这是“原子群”的一个例子,其细节在下面给出。此特定组匹配两个字符序列 CR 后跟 LF,或单个字符 LF(换行符,U+000A)、VT(垂直制表符,U+000B)、FF(换页符,U+000C)、CR (回车,U+000D)或 NEL(下一行,U+0085)。两个字符的序列被视为一个不能拆分的单元。

在 UTF-8 模式下,增加了两个代码点大于 255 的字符:LS(行分隔符,U+2028)和 PS(段落分隔符,U+2029)。识别这些字符不需要 Unicode 字符属性支持。

可以通过在编译时或匹配模式时设置选项 PCRE_BSR_ANYCRLF 来限制 \R 仅匹配 CR、LF 或 CRLF(而不是完整的 Unicode 行结尾集)。(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 被视为无法识别的转义序列,因此默认匹配字母“R”,但如果设置了 PCRE_EXTRA,则会导致错误。

于 2011-10-20T13:31:10.690 回答
19

为了规范换行符,我总是使用:

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

它将旧的 Mac ( \r) 和 Windows ( \r\n) 换行符替换为 Unix 等效项 ( \n)。

我更喜欢使用\n,因为它只需要一个字节而不是两个,但您可以轻松地将其更改为\r\n.

于 2011-11-02T02:21:33.417 回答
10

怎么样

$sNicetext = preg_replace('/\r\n|\r|\n/', "\r\n", $sNicetext);
于 2011-10-20T13:30:58.623 回答
5

我认为转换为 CRLF 的最聪明/最简单的方法是:

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

仅转换为 LF:

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

它比正则表达式容易得多。

于 2017-02-22T07:49:49.440 回答
1
$sNicetext = str_replace(["\r\n", "\r"], "\n", $sNicetext);

也有效

于 2021-01-12T03:14:40.493 回答