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


Storing an escape sequence in a variable for use later

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

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

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

您是否尝试过像这样将变量括起来:$csv->setDelimiter("{$this->csv_delimiter}");

我使用这个代码示例来检查它:

$obj = json_decode(json_encode(array("a" => "'t")));
var_dump("{$obj->a}"); // output: string(1) "   "