3

我有一个文本文件,其中包含文字字符串\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);

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

4

5 回答 5

5

省去弄清楚正则表达式的工作,然后尝试str_replace()

str_replace('\r\n', "\n", $string);
于 2011-08-17T19:44:47.820 回答
4

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

$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是您要匹配的内容?..

于 2011-08-17T19:47:42.963 回答
2

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);

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

于 2011-08-17T20:00:11.377 回答
2
$result = preg_replace('/\\\\r\\\\n/', '\n', $subject);

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

参考:

于 2011-08-18T00:04:49.410 回答
1

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

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

 "/[\n\r]/"

PHP

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

或者

 preg_replace("/[\n\r]/",$replaceStr, $string )
于 2020-06-01T20:14:07.990 回答