这可能看起来有些微不足道,但这种好奇心一直困扰着我。
我有一个用户上传CSV文件的前端页面。他们可以选择分隔符,文件等,然后让服务器处理请求。例如,如果用户选择“tab”选项,那么'\ t'将被存储为变量中的分隔符,然后我可以从我的模型中检索该变量。
当我尝试按原样使用该值时会出现问题;
$csv->setDelimiter($this->csv_delimiter);
因为它没有被正确地视为转义序列,所以League \ Csv(我正在使用的库)将抛出异常,说明分隔符必须是单个字符。
我可以通过这样做来克服这个问题;
if($this->csv_delimiter == '\t'){
$csv->setDelimiter("\t");
}
else{
$csv->setDelimiter($this->csv_delimiter);
}
然而对我来说,这似乎很麻烦,并且有点代码味道。我尝试在setDelimiter
方法中将变量括在双引号中,但这也不起作用。有没有办法强制变量使用转义序列?或许我应该使用更多的文字表示,例如字符代码/十六进制代码?
编辑:
我想我现在看到了问题;
<?= $form->field($model, 'csv_delimiter')->dropDownList([',' => 'Comma',
';' => "Semicolon",
'\t' => 'Tab']); ?>
我正在存储文字字符串,而不是转义序列。原因是它是必填字段。当我使用双引号时,它不起作用。我现在意识到这是因为jQuery将选项卡视为空白值而不接受它,这就是我切换回单引号的原因。
我要么必须删除验证或在验证器上应用回调(可能),但两者都应该解决问题。
答案 0 :(得分:0)
您是否尝试将变量括起来:<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<form id="myForm">
<input id="actualprice" type="number" placeholder="Actual Price">
<input id="discount" type="number" placeholder="Discount">
<input id="shipping" type="number" placeholder="Shipping">
<input id="result" name="totalamount" value="" readonly />
<h3 id="result2"></h3>
<input type="submit" value="Submit">
</form>
?
我用这个代码示例来检查它:
$csv->setDelimiter("{$this->csv_delimiter}");