删除 Javascript 数组中的反斜杠转义

Remove Backslash Escaping in Javascript Array

我有一个非常复杂的问题。

我正在使用 PHP 将 CSV 文件解析为数组,然后

var array = <?php echo json_encode( $array ) ?>;

将其传递给 Javascript array

array 是二维的,像这样:

var array = [["\/\ssa","14104","26","2113","0","867","28083","15","43695"],
             ["Yee","8661","24","2215","0","991","25245","15","49086"],...]

现在,当用户名的结构如下时,有时似乎会出现反斜杠转义问题:

["username\","sth","sth",...] 所以当用户名以反斜杠结尾时 \ .

输出将是:

username", sth, sth, ...

但这只是子数组的第一个元素,其他8个地方都是空的

我已经尝试用循环替换来修复它,但我不知道如何添加 \" 作为搜索值。这在 JS 中是不可能的,因为 \" 总是转义吗?已经尝试 charAt() 将最后一个字符与反斜杠进行比较,但没有成功。在 PHP 中将它传递给 JS 之前是否必须替换它? Parse函数是这样的,如果重要的话:

<?php>

$url = "data.csv";
$csvData = file_get_contents($url);
$lines = explode(PHP_EOL, $csvData);
$array = array();
foreach ($lines as $line) {
$array[] = str_getcsv($line);

?>

这里有一个你可以玩的 JSfiddle: https://jsfiddle.net/cLmbe0qf/

您只需要用 html 特殊字符替换反斜杠:

foreach ($lines as $line) {
    $line = str_replace("\", "&#92;", $line);
    // ...
}

这有点棘手,因为您必须将 javascript 解析为 object/array。任何时候你这样做,反斜杠都会被解析出来。为避免这样做,您需要将值存储在 HTML 页面中或使用 String.raw 获取字符串的文字版本。

实现它的一种方法是将字符串放入 html 并获取隐藏文本区域的值。 (你可以将它存储在任何地方,我只是选择了 textarea)。然后你通过这个 javascript 函数 slashParse 传递它,它将用 ~{}~ 替换所有斜杠然后 运行 javascript 解析算法,然后替换 ~{}~ 回到反斜杠。

function slashParse(target) {
  var value = document.getElementById(target).value;
  var replacedVal = value.replace(/\/g, '~{}~');
  var parsedVal = JSON.parse(replacedVal);
  var mappedVal = parsedVal.map(function(item) {
    return item.replace(/~{}~/g, '\');
  });
  return mappedVal;
}
var parsed = slashParse('input');
console.log(parsed)
document.getElementById("test").innerText = parsed;
<body>
  <div id="test"></div>
</body>
<textarea style="display:none" id="input">["use\rna&lt;/textarea&gt;&lt;textarea&gt;me\","2","3","4"]</textarea>

将其回显到页面上可能看起来像这样。

<textarea style="display:none" id="php-part">
  <?=json_encode(htmlentities($array,ENT_NOQUOTES))?>
</textarea>

这只是几个解决方案中的一个。另一种选择是在 php 方面做更多的解析。您将 运行 遇到的问题是,在某些时候您需要通过 JavaScript 解析程序 运行 字符串。当发生这种情况时,您不能有任何反斜杠。然后在 运行 通过解析后,您必须将所有隐藏的反斜杠转换回反斜杠。

这种方法的一个问题是,如果在任何地方都将 ~{}~ 放置在字符串中,之后它将被转换为反斜杠。为了让它更冷漠,你可以做的是让字符串反斜杠变得更加模糊。比如~{BACKSLASH_ESCAPE}~