我有一个文本字符串\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);
但它不适用于我从我的文件中读取的行。
答案 0 :(得分:5)
省去了计算正则表达式的工作,然后尝试str_replace()
:
str_replace('\r\n', "\n", $string);
答案 1 :(得分:3)
节省你自己努力计算正则表达式和双引号内的转义:
$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
是您要匹配的内容?..
答案 2 :(得分:2)
UTF-16就是问题所在。如果你只是使用原始字节,那么你可以使用完整的序列来替换:
$out = str_replace("\x00\x5c\x00\x72\x00\x5c\x00\x6e", "\x00\x0a", $in);
这假设为big-endian UTF-16,否则将零字节交换为非零后的字节:
$out = str_replace("\x5c\x00\x72\x00\x5c\x00\x6e\x00", "\x0a\x00", $in);
如果这不起作用,请发布输入文件的字节转储,以便我们可以看到它实际包含的内容。
答案 3 :(得分:1)
$result = preg_replace('/\\\\r\\\\n/i', '\n', $subject);
答案 4 :(得分:1)
我总是一直在寻找这个主题,而且我总是回到我写的个人专栏中。
它看起来很整洁,它基于RegEx:
"/[\n\r]/"
PHP
preg_replace("/[\n\r]/",'\n', $string )
或
preg_replace("/[\n\r]/",$replaceStr, $string )