我正在构建一个 CSV 导出工具。几个月来它一直运行良好,但我们最近遇到了几个由单元格“爆炸”引起的额外线条的情况。
我已将问题缩小到 PHP(7.2.21 和其他版本)中的一个错误。我需要解决这个问题。下面是重现问题的 PHP 脚本。它在每个单元格中包含逗号和换行符:
<?php
$data = array(
array( 'ID', 'Name', 'Content', 'Date' ),
array( 34, 'Radley', 'This is <strong>bold text</strong>, and' . "\r\n" . 'a second line, the first time', '2019-08-23' ),
array( 47, 'John', 'This a <a href=\"http://example.org/\">link</a>' . "\r\n" . 'a second line, again', '2019-08-24' ),
array( 65, 'Bob', 'This plain text, with no html, and lots of commas'. "\r\n" . 'and a third extra row', '2019-08-25' ),
);
$fh = fopen('php://output', 'w');
foreach( $data as $row ) fputcsv( $fh, $row );
echo stream_get_contents( $fh );
fclose( $fh );
?>
如果我们print_r的$data,我们可以看到这是只有四个值:
[2] => Array (
(
[0] => 47
[1] => John
[2] => This a <a href=\"http://example.org/\">link</a>
a second line, again
[3] => 2019-08-24
)
)
所以我希望这段代码生成四行,每行四列,但“John”的第三项只有 3 列,并且还添加了一个三列的额外行。
问题不仅仅是\"
已经逃脱了。将它放在字符串中会禁用 fputcsv 转义其他所有内容。
这种格式错误的数据可以在 Windows 和 Mac 的 Excel 中看到,也可以在 Windows Chrome 中的 Google 表格中看到,可能还有其他所有内容。但是如果你把它重新加载到 PHP 中,fgetcsv
它就可以工作了,那么 PHP 必须故意这样做吗?
我需要更正这个错误,以便正确\"
转义为\""
,因此所有其他逗号和双引号也被转义。我正在构建的插件导出由其他插件生成的内容,那些可能已经转义的数据需要通过自己的机制保持转义。
有没有办法确保每个单元格都被转义,即使单元格有反斜杠和引号?
慕桂英546537