将转义序列存储在变量中以供以后使用

时间:2016-02-05 17:42:13

标签: php csv

这可能看起来有些微不足道,但这种好奇心一直困扰着我。

我有一个用户上传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将选项卡视为空白值而不接受它,这就是我切换回单引号的原因。

我要么必须删除验证或在验证器上应用回调(可能),但两者都应该解决问题。

1 个答案:

答案 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}");