$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,则会导致错误。