我有一个textarea在一个正常工作的网站上提交到我的数据库。但是当我从我的数据库生成CSV(通过PHP)时,所有换行符都会破坏生成的CSV。任何CSV阅读器都会将输入中的换行符解释为换行符。
我尝试了以下方法:
将字段用引号括起来。
此:
$field = str_replace(array('\n', '\r', '\r\n', '\n\r'), ',', $original_field);
还有:
$field = strip_tags(nl2br($original_field));
结合上述所有方法。
无论如何,结尾的结果仍然是乱七八糟的CSV,它将在用户输入的任何换行符中断开。我已经设法阻止文本区域中的新换行符,但是还有很多遗留提交要求我在CSV端修复此问题。
为什么不起作用?我该如何解决这个问题?
答案 0 :(得分:13)
在接受的答案(用户user1517891
)不正确之前,当有\r\n
时,它会在字符串中替换两次......它会将其替换为两个逗号,
。首先,它将取代\r
=> ,
,然后\n
=> ,
。
您需要以不同的顺序使用它,如:
$field = str_replace(array("\r\n", "\n\r", "\n", "\r"), ',', $original_field);
答案 1 :(得分:9)
使用双引号:
$field = str_replace(array("\n", "\r", "\r\n", "\n\r"), ',', $original_field);
答案 2 :(得分:3)
我建议使用preg_replace()
而不是str_replace()
。原因是\r
和\n
可能有多个换行符和组合,我希望您只想用一个逗号替换它们。
我还建议使用trim()
删除尾随空行。
$field = preg_replace('/[\n\r]+/', ',', trim($original_field));
答案 3 :(得分:2)
您必须将\n
和类似标记放在双引号中,否则它们将被视为简单字符串而不是换行符。
答案 4 :(得分:1)
如果您使用fputcsv()
,则此问题甚至不应存在:
fputcsv($f, array($field1, $field2, $field3));
默认情况下,它使用逗号作为分隔符,并使用双引号作为字符串封装。