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

时间:2015-06-28 15:14:18

标签: javascript php arrays backslash

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

我使用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"],...]

现在,有时用户名中的反斜杠转义似乎存在问题,如下所示:

[&#34;用户名\&#34;,&#34; sth&#34;,&#34; sth&#34;,...],所以当用户名以反斜杠结尾时\。

输出将是:

username", sth, sth, ...

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

我已经尝试使用循环替换修复它,但我不知道如何添加\&#34;作为搜索价值。这是不可能在JS中做的,因为\&#34;总是逃避?已经尝试过charAt()将最后一个字符与反斜杠进行比较,但没有成功。在将它传递给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/

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

这有点棘手,因为你必须将javascript解析为一个对象/数组。无论何时执行此操作,都会解析反斜杠。为避免这样做,您需要将值存储在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}~