【问题标题】:CSV not building properly with fputcsv when one cell includes Javascript code当一个单元格包含 Javascript 代码时,CSV 无法使用 fputcsv 正确构建
【发布时间】:2014-10-22 14:44:21
【问题描述】:

我正在尝试使用 fputcsv 使用 php 创建一个 csv 文件,其中一个单元格包含 javascript 代码。 我遇到的问题是包含 javascript 代码的单元格包含以下字符:

' | " \ / ,

这会在我每次加载 csv 文件时破坏它。它将 javascript 代码中的逗号视为分隔符,因此将代码拆分到多个单元格中。

我正在 excel 中查看 csv 文件。

我知道excel会用双引号封装字符串,例如短语:

乔说:“怎么样?”

将被转换为

”乔说,“怎么样?””

但是使用 javascript 代码,这种封装不起作用。

这是一段需要放入 csv 的有问题的 javascript 代码:

document.body.innerHTML.toLowerCase().replace(/\s|\"|\'/g, "");

上面 js 中的 \" 是导致问题的原因,而 g 后面的逗号正在启动一个新单元格。
如果我执行str_replace('\"','', ** javascript code **);,则 csv 会正确生成。但是我不允许更改任何 js,只能转义字符

任何人都可以提供任何解决此问题的方法吗?也许有一种方法可以在 \" 上执行 str_replace,将其保留在 js 中,但将其正确转义以便 excel 在单元格中查看?

非常感谢

乔

【问题讨论】:

  • 您可以更改分隔符fputcsv($fileHandle, $array, "\t");
  • 不幸的是,js代码中也有标签......
  • 使用在代码中永远不会发生的混合并将其用作分隔符 /delimiter '||||'...你不能删除 JS 中的制表符吗?

标签: javascript php excel csv fputcsv


【解决方案1】:

在这里查看:

    $line=array();
    for($x=0;$x<=3;$x++)
    {
    $line[$x]="Sample data".$x;
    }

$line[4]= <<<EOT
document.body.innerHTML.toLowerCase().replace(/\s|\"|\'/g, "");
EOT;

        $fp = fopen('final.csv', 'w');
            fputcsv($fp, $line);
        fclose($fp);

final.csv 的内容:

"Sample data0","Sample data1","Sample data2","Sample data3","document.body.innerHTML.toLowerCase().replace(/\s|\"|\'/g, """");"
                                                                                                                         ^^

使用HEREDOC,您可以将该行放在一个字符串中并将其插入到 csv 文件中。

但这不是解决方案,因为它会在 csv 文件中插入更多引号,但可以帮助您获得真正的解决方案。

更多

echo $string."<br><br>";
$arr1 = str_split($string);

for($i=0;$i<count($arr1);$i++) {
if($arr1[$i]=='"' and $arr1[$i+1]=='|'){ $arr1[$i]='""';}  //this will only work if "| are together
}
echo implode("", $arr1);

返回:

document.body.innerHTML.toLowerCase().replace(/\s|\"|\'/g, "");

document.body.innerHTML.toLowerCase().replace(/\s|\""|\'/g, ""); 

【讨论】:

  • 您好,感谢您的建议,不幸的是,这对我也不起作用。我目前正在尝试使用 preg_replace 将 \" 更改为 \""。这目前不起作用,您有什么想法吗?到目前为止,我得到了:$pattern = '(\\\")' ; $replacement = '\\\ "'; preg_replace($pattern, $replacement, $js_code); 将其转换为 \ "" 由于空格,这也是不正确的,任何想法如何用 \ 替换它“”?
  • 感谢 Kraysak 迄今为止的帮助。我发现这个问题可能是由于 fputcsv 和 preg_replace 的结合造成的。我在这个问题中更详细地介绍了它:stackoverflow.com/questions/26530680/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-20
  • 2011-08-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多