4

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

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

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

4

4 回答 4

0

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

{{ "yes \ no" | replace "\", "\\\" }}

将用双齿隙代替单齿隙

于 2021-07-24T04:54:32.960 回答
0

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

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

于 2020-06-08T21:27:43.623 回答
0

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

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

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

于 2021-08-31T05:56:43.297 回答
0

我参加聚会太晚了吗?但这里是答案。首先 -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'
替换为破折号:'Domain-user'
替换为双斜杠:'Domain\\user'

于 2019-08-30T18:29:21.457 回答