点液体如何转义反斜杠

Posted

技术标签:

【中文标题】点液体如何转义反斜杠【英文标题】:dot liquid how to escape backslash 【发布时间】:2019-12-21 06:52:54 【问题描述】:

我在从具有合法反斜杠 (\) 的 azure web api 发送数据时遇到问题。数据字段为user id,其模式如下: Domain\UserId 我想将它按原样存储在数据库中。但 Dot Liquid 不会对其进行处理。 我尝试使用 escape、escape_once 和 replace

 body.requestor | escape_once 
 body.requestor | escape 
 body.requestor | replace "\", "\\"

但他们都没有工作。我不能要求我的 web api 的调用者使用两个反斜杠传递 user id - \\。我必须在我的 web api 中进行更改以接受用户 ID 的原样。 任何输入/指针表示赞赏。

【问题讨论】:

【参考方案1】:

我参加聚会是不是太晚了?但这里是答案。首先 - Replace 区分大小写。然后你需要使用冒号“:”来参数。第三,我没有解释,但我怀疑它需要 item 来找到 escape 和 item 来替换,而不用逃逸。这是程序

string templateString = 
@"Nothing: ' k3 '
Replace with dash: ' k3|Replace:""\\"", ""-"" '
Replace with double slash: ' k3|Replace:""\\"", ""\\"" '";

Template.NamingConvention = new CSharpNamingConvention();
var t = Template.Parse(templateString);
string output = t.Render(Hash.FromDictionary(new Dictionary<string, object>()  "k3", "Domain\\user"  ));
Console.WriteLine(output);

输出:

无:“域\用户” 替换为破折号:“域用户” 替换为双斜杠:'Domain\\user'

【讨论】:

过滤器大小写取决于您使用它们的上下文。例如,如果您在在线测试站点上使用它们,则小写字母是正确的。我们不能假设问题的上下文。【参考方案2】:

这可能是转义标准过滤器的 dot Liquid 实现中的一个错误,或者可以说是 Shopify 规范过于模糊,因此实现会有所不同。 dot Liquid 正在使用 .NET RegEx 替换导致模式匹配的“\”被解释为模式的开头和每个 https://docs.microsoft.com/en-us/dotnet/standard/base-types/character-escapes-in-regular-expressions 的转义符

所以你需要 body.requestor | replace "\\", "\\" (!) 要搜索的模式解释转义(所以它是一个匹配的 \),而替换字符串不解释转义(所以它是实际的双 \\ 字符串)。

【讨论】:

对我不起作用。由于某种原因,模式不匹配。【参考方案3】:

当我正在寻找相同的问题时,会出现此问题,仅适用于 ruby​​ gem 液体实现。大卫伯格的回答给了我提示,这就是有效的:

"yes \ no" | replace "\", "\\\"

将用双齿隙代替单齿隙

【讨论】:

【参考方案4】:

你几乎明白了,正确的解决方案是:

 body.requestor | replace "\", "\\\\"

第一个参数一个反斜杠,第二个参数四个。 第一个参数是字面的。 第二个参数被解析,因为我们想要两个反斜杠,我们需要用另一个反斜杠来转义它们中的每一个。总共制作四个反斜杠。

【讨论】:

以上是关于点液体如何转义反斜杠的主要内容,如果未能解决你的问题,请参考以下文章

MySQL中如何插入反斜杠,反斜杠被吃掉,反斜杠转义(转)

python 如何快速转义路径字符串中的斜杠

如何使用单个反斜杠转义字符串的特殊字符

`stringr::str_glue`:如何转义反斜杠(\)?

转义反斜杠在javascript中打印两个反斜杠

jquery 冒号转义 为啥双斜杠