我需要在FTL中替换URL中的特定字符串。
代码1:
<#assign pageUrlWithParams= "https://sample.com/category?filter=low&navParam=Appliances&skrLocale=en_US&t=1"/>
<#if pageUrlWithParams?? && pageUrlWithParams != '' && pageUrlWithParams?contains("skrLocale")>
<#assign pageUrlWithParams = pageUrlWithParams?replace('skrLocale','')/>
</#if>
${pageUrlWithParams}
代码2:
<#assign pageUrlWithParams= "https://sample.com/category?filter=low&navParam=Appliances&skrLocale=en_FR&t=2"/>
<#if pageUrlWithParams?? && pageUrlWithParams != '' && pageUrlWithParams?contains("skrLocale")>
<#assign pageUrlWithParams = pageUrlWithParams?replace('skrLocale','')/>
</#if>
${pageUrlWithParams}
我需要删除&#34; skrLocale = en_US&#34;和&#34; skrLocale = en_FR&#34;来自pageUrlWithParams。
已知文字是&#34; skrLocale&#34;,使用此我需要删除&#34; skrLocale = en_US&#34;和&#34; skrLocale = en_FR&#34;。 由于en_US和en_FR,我不知道如何在等于之后采用那个部分。
有人建议给出答案。提前致谢
答案 0 :(得分:1)
使用正则表达式('r'
作为?replace
的第三个参数)是关键。请注意,由于URL语法的复杂性,我们需要处理两个边缘情况(skrLocale
是第一个参数,skrLocale
是唯一参数),以下函数实现。但是,它不会在参数名称中处理%xx
转义(您可能不关心):
<#function removeSkrLocale url>
<#return url?replace(r'([&\?])skrLocale=[^&]*&?', '$1', 'r')?remove_ending('?')>
</#function>
${removeSkrLocale(pageUrlWithParams)}
当然,您也可以直接在#function
内部${}
执行此操作,但它可以重复使用,并且可以通过这种方式进行自我记录。
答案 1 :(得分:0)
我会使用Freemarker function(这是一个简单的版本,可以改进)
<#function remove_param_if_value_equals pageUrlWithParams paramName, paramValues >
<#if pageUrlWithParams?has_content && pageUrlWithParams?contains(paramName)>
<#list paramValues as paramValue>
<#local paramNameAndValue = paramName + "=" + paramValue />
<#local pageUrlWithParams = pageUrlWithParams?replace(paramNameAndValue,'')/>
</#list>
</#if>
<#return pageUrlWithParams />
</#function>
<#assign pageUrlWithParams= "https://sample.com/category?filter=low&navParam=Appliances&skrLocale=en_US&t=1"/>
<#assign pageUrlWithParams = remove_param_if_value_equals(pageUrlWithParams, "skrLocale", ["en_US", "en_FR"]) />
${pageUrlWithParams}
执行业务的代码仍然是孤立的,可以在以后更改/改进。
(例如,有可以清理的双“&amp;”
答案 2 :(得分:0)
我不知道FTL。但是,如果您需要在网址中替换参数 skrLocale ,我认为以下是您可以使用的好模式:
(skrLocale(.*?)&)
将(。*?)称为lazy,它从 skrLocale 匹配到最近的&amp; 。因此,根据您的情况,它将匹配 skrLocale = en_US&amp; 和 skrLocale = en_FR&amp; 。