Замена строки в FTL определенным словом - PullRequest
0 голосов
/ 03 мая 2018

Мне нужно заменить определенную строку в URL в FTL.

Код 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}

Мне нужно удалить "skrLocale = en_US" и "skrLocale = en_FR" из pageUrlWithParams.

Известный текст - "skrLocale", с помощью этого мне нужно удалить "skrLocale = en_US" и "skrLocale = en_FR". Из-за en_US и en_FR я не знаю, как взять эту часть после равенства.

Некоторые предлагают ответ, пожалуйста. Заранее спасибо

Ответы [ 3 ]

0 голосов
/ 03 мая 2018

Использование регулярных выражений ('r' в качестве 3-го параметра для ?replace) является ключом. Обратите внимание, что из-за сложности синтаксиса URL нам необходимо обработать два крайних случая (skrLocale - первый параметр, а skrLocale - единственный параметр), которые выполняет приведенная ниже функция. Однако он не обрабатывает %xx экранирования в имени параметра (что может вас не волновать):

<#function removeSkrLocale url>
  <#return url?replace(r'([&\?])skrLocale=[^&]*&?', '$1', 'r')?remove_ending('?')>
</#function>

${removeSkrLocale(pageUrlWithParams)}

Конечно, вы можете сделать это и без #function, прямо внутри ${}, но это можно использовать многократно и более самодокументировано.

0 голосов
/ 03 мая 2018

Я не знаю о FTL. Но если вам нужно заменить параметр skrLocale в вашем URL, я думаю, что ниже хороший шаблон, который вы можете использовать:

(skrLocale(.*?)&)

С (. *?) Называется ленивым, оно соответствует от skrLocale до ближайшего & . Поэтому в вашем случае он будет соответствовать skrLocale = en_US & и skrLocale = en_FR & .

0 голосов
/ 03 мая 2018

Я бы использовал функцию Freemarker (это простая версия, может быть улучшена)

<#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}

Код, который делает бизнес, остается изолированным и может быть изменен / улучшен позже.

(Например, есть двойное «&», которое можно очистить)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...