【问题标题】:Problem Replacing Literal String \r\n With Line Break in PHP在 PHP 中用换行符替换文字字符串 \r\n 的问题
【发布时间】:2011-10-29 05:38:17
【问题描述】:

我有一个文本文件,其中包含文字字符串\r\n。我想用实际的换行符 (\n) 替换它。

我知道正则表达式 /\\r\\n/ 应该匹配它(我已经在 Reggy 中对其进行了测试),但我无法让它在 PHP 中工作。

我尝试了以下变体:

preg_replace("/\\\\r\\\\n/", "\n", $line);

preg_replace("/\\\\[r]\\\\[n]/", "\n", $line);

preg_replace("/[\\\\][r][\\\\][n]/", "\n", $line);

preg_replace("/[\\\\]r[\\\\]n/", "\n", $line);

如果我只是尝试替换反斜杠,它可以正常工作。只要我添加一个 r,它就找不到匹配项。

我正在读取的文件被编码为 UTF-16。

编辑:

我也已经尝试过使用str_replace()

我现在认为这里的问题是文件的字符编码。我尝试了以下方法,它确实有效:

$testString = "\\r\\n";
echo preg_replace("/\\\\r\\\\n/", "\n", $testString);

但它不适用于我从文件中读取的行。

【问题讨论】:

    标签: php regex preg-replace backslash


    【解决方案1】:

    省去弄清楚正则表达式的工作,改用str_replace()

    str_replace('\r\n', "\n", $string);
    

    【讨论】:

    • 我应该在我原来的问题中提到这也不起作用。我现在将其添加。
    • @Katfish 使用单引号而不是双引号。 str_replace('\r\n', "\n", $string)
    • @Wiseguy 我在regular-expressions.info/php.html 上读到过,但这对我的任何测试都没有影响。我已经使用 str_replace 和 preg_replace 两种方式都试过了。
    【解决方案2】:

    省去弄清楚正则表达式和双引号内转义的工作:

    $fixed = str_replace('\r\n', "\n", $line);
    

    对于它的价值,preg_replace("/\\\\r\\\\n/", "\n", $line); 应该没问题。作为示范:

    var_dump(preg_replace("/\\\\r\\\\n/", "NL", 'Cake is yummy\r\n\r\n'));
    

    给:string(17) "Cake is yummyNLNL"

    也可以:'/\\\r\\\n/''/\\\\r\\\\n/'

    重要 - 如果上述方法不起作用,您是否确定文字 \r\n 是您要匹配的内容?..

    【讨论】:

    • 这绝对是我想要匹配的,但我现在怀疑 r 和 n 可能与 PHP 使用的 r 和 n 不同。我的文件使用 UTF-16。
    【解决方案3】:

    UTF-16 是问题所在。如果您只是使用原始字节,那么您可以使用完整的序列进行替换:

    $out = str_replace("\x00\x5c\x00\x72\x00\x5c\x00\x6e", "\x00\x0a", $in);
    

    这假定大端 UTF-16,否则将零字节交换到非零之后:

    $out = str_replace("\x5c\x00\x72\x00\x5c\x00\x6e\x00", "\x0a\x00", $in);
    

    如果这不起作用,请发布您的输入文件的字节转储,以便我们查看它实际包含的内容。

    【讨论】:

    • 效果很好。谢谢!另外,你能告诉我你从哪里得到 UTF-16 的字节值吗?我之前搜索的时候没找到。
    • 如果忽略代理对,UTF-16 只接受 U+abcd 并将其编码为 2 个字节 \xab\xcd。这些代码就是反斜杠 (x5c)、'r' (x72) 和 'n' (x6e) 的 ASCII 字节。 0x0a 是您要替换它们的换行符
    【解决方案4】:
    $result = preg_replace('/\\\\r\\\\n/', '\n', $subject);
    

    上面的正则表达式用 linux 换行符 (\n) 替换了通常在 windows (\r\n) 上使用的换行符类型。

    参考资料:

    【讨论】:

      【解决方案5】:

      我一直在寻找这个话题,我总是回到我写的个人台词。

      它看起来很整洁,并且基于 RegEx:

       "/[\n\r]/"
      

      PHP

       preg_replace("/[\n\r]/",'\n', $string )
      

       preg_replace("/[\n\r]/",$replaceStr, $string )
      

      【讨论】:

      • 你应该(重新)阅读这个问题!他们想用换行符 \n 替换 文字字符串 \r\n。您的正则表达式将 \n\r 替换为 \n
      猜你喜欢
      • 1970-01-01
      • 2021-09-26
      • 1970-01-01
      • 2020-07-23
      • 2011-09-18
      • 1970-01-01
      • 2022-12-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多