如何以最聪明的方式替换PHP中的不同换行样式



我有一个文本,它可能具有不同的换行样式。我想将所有换行符'\r\n'、'\n'、'\r\'替换为相同的换行符(在这种情况下\r\n(。

做这件事最快的方法是什么?我目前的解决方案看起来像这样,非常糟糕:

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

问题是,您不能用一个替换来完成此操作,因为\r\n将被复制到\r\n\r\n。

谢谢你的帮助!

$string = preg_replace('~R~u', "rn", $string);

如果您不想替换所有Unicode换行符,而只想替换CRLF样式的换行符,请使用:

$string = preg_replace('~(*BSR_ANYCRLF)R~', "rn", $string);

R匹配这些换行符,u是将输入字符串视为UTF-8的修饰符。


来自PCRE文档:

什么R匹配

默认情况下,模式中的序列\R与任何Unicode换行符匹配序列,无论选择什么作为行结束序列。如果您指定

     --enable-bsr-anycrlf

默认值已更改,使得\R仅与CR、LF或CRLF匹配。构建PCRE时选择的任何内容都可以在库函数被调用。

换行序列

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

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

这是一个"原子组"的例子,详细情况如下在下面这个特定的组匹配两个字符的序列后面跟着LF的CR或单个字符LF(换行,U+000A(、VT(垂直接线片,U+000B(、FF(formfeed,U+000C(、CR(支架return,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_eexec((或pcre_dfa_exec((。请注意,这些特殊设置与Perl不兼容,只有在模式,并且它们必须使用大写字母。如果不止一个存在,使用最后一个。它们可以与换行约定;例如,一个模式可以以开头

    (*ANY)(*BSR_ANYCRLF)

它们也可以与(*UTF8(或(*UCP(特殊序列组合。在字符类中,\R被视为无法识别的转义序列,因此默认情况下与字母"R"匹配,但会导致错误如果设置了PCRE_ EXTRA。

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

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

它用Unix等效程序(n(取代了旧的Mac(r(和Windows(rn(换行符。

我倾向于使用n,因为它只占用一个字节,而不是两个字节,但您可以很容易地将其更改为rn

怎么样

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

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

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

仅转换为LF:

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

它比正则表达式简单得多。

$sNicetext = str_replace(["rn", "r"], "n", $sNicetext);

也适用于

相关内容

  • 没有找到相关文章

最新更新