【问题标题】:Replace any combination of (CR) and (LF) with a single (CRLF) in a text file using php使用 php 在文本文件中将 (CR) 和 (LF) 的任意组合替换为单个 (CRLF)
【发布时间】:2023-03-14 15:58:01
【问题描述】:

在不同的文本文件中(或在单个文本文件中)我有不同的行尾组合(参见下面的示例)。

如何用一个简单的 CRLF 统一 CR 和 LF 的所有组合? 简而言之,我需要使用 PHP 将每个 CR 和 LF 组合替换为一个 CRLF。 使用 str_replace 我可以替换它们,但我的问题是要使用正确的搜索字符串。

$textfile=str_replace("search string i need","CRLF to replace", $textfile);

要修复的通用文本文件示例:

text line 1 CRLFLFCRCRLF
text line 2 LFLFCRLFCRCR
text line 3 CRLF
text line 4 CR
text line 5 LF

我需要将所有的 \r\n 随机组合只替换为 \r\n ,如下所示:

text line 1 CRLF
text line 2 CRLF
text line 3 CRLF
text line 4 CRLF
text line 5 CRLF

【问题讨论】:

  • 欢迎来到 SO!请阅读this guide,了解如何制定问题以增加获得可用答案的机会。就像现在一样,由于问题太宽泛,所以有太多不同的好答案。您可以通过包括您自己尝试过的内容来缩小范围。
  • 我修改了问题。现在好点了吗?对不起,这是我的第一个问题,下一个会更好。感谢您理解我。

标签: php regex preg-replace str-replace


【解决方案1】:

PCRE 具有任何换行符组合的别名:\R

你可以这样做:

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

在 8 位模式下,\R 匹配 CR、LF 或 CRLF,但也匹配垂直制表 (VT)、换页 (FF) 和下一行字符 (NEL)。
换句话说,\R(?>\r\n|\n|\x0b|\f|\r|\x85) 的别名。但是由于 VT、FF 和 NEL 现在很少(从不?)使用......但是,可以在模式开始时使用 (*BSR_ANYCRLF)\R 限制为仅 CR、LF 和 CRLF:

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

如果您想将\R 的含义扩展到任何 unicode 换行符序列,请使用 u 修饰符:

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

具体来说,它将行分隔符 U+2028 和段落分隔符 U+2029 添加到换行符序列列表中。

注意\R别名,而不是速记字符类。所以你不能把它放在一个字符类中。


intl transliterator

使用 intl transliterator 而不是使用正则表达式的简单替换函数可能会很有趣,特别是如果您需要对字符串进行其他修改。所有这些都可以集中在一组独特的规则中:

$tls = Transliterator::createFromRules('[\r\n]+ > \r\n;');
$text = $tls->transliterate($text);

【讨论】:

  • 添加一个+ 量词以将多个换行符替换为一个。
【解决方案2】:

你真的不需要正则表达式:

str_replace(["\r\n", "\r", "\n"], "\r\n", $str);

这将替换数组中的每一个字符串(并保持顺序,所以如果你有\r\n,它不会被替换为\r\n\r\n)。

【讨论】:

  • 解析错误:语法错误,意外'[',期待')'
  • 您使用的是哪个版本的 PHP? (旧版本使用 Array("\r\n", "\r", "\n") 而不是 ["\r\n", "\r", "\n"]
  • 现在错误已修复,但 CRLF 成倍增加而不是固定。这是我使用您建议的字符串的代码: $str1=file_get_contents($_FILES['uploaded']['tmp_name']); $str2=str_replace(数组("\r\n", "\r", "\n"), "\r\n", $str1); file_put_contents($_FILES['uploaded']['tmp_name'], $str1);我哪里错了?
  • 你把更改放进去后没有使用$str2
  • 感谢您的回答。我听从了你的建议,我使用的字符串是: $str1 = str_replace(array("\n", "\r"), "
    ", $str1);不幸的是,它在文件的每个结尾多次替换了
    ,而我只需要一个
    每一行。怎么修改?
【解决方案3】:

要将 '\r\n' 的所有组合替换为 '\r\n',请使用:

$result = preg_replace('/[\r\n]+/', "\r\n", $text);

这也会将单个 '\r' 或 '\n' 替换为 '\r\n'。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-10-24
    • 2019-07-02
    • 1970-01-01
    • 2019-08-06
    • 1970-01-01
    • 2011-03-07
    • 2011-10-21
    相关资源
    最近更新 更多