我有一个非常复杂的问题。
我使用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/
答案 0 :(得分:0)
您只需要用html特殊字符替换反斜杠:
foreach ($lines as $line) {
$line = str_replace("\\", "\", $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</textarea><textarea>me\\","2","3","4"]</textarea>
在页面上回显的内容可能会像这样。
<textarea style="display:none" id="php-part">
<?=json_encode(htmlentities($array,ENT_NOQUOTES))?>
</textarea>
这只是其中一个解决方案。另一个选择是在php方面做更多的解析。您将遇到的问题是,您需要在某些时候通过JavaScript解析程序运行该字符串。当发生这种情况时,你不能有任何反斜杠。然后在运行解析之后,您必须将所有隐藏的反斜杠转换回反斜杠。
这种方法的一个问题是,如果在字符串中放置~{}~
的任何地方,之后它将被转换为反斜杠。为了使它更加冷漠,你可以做的就是让字符串反斜杠变得更加模糊。例如~{BACKSLASH_ESCAPE}~