Как провести поиск-замену внутри данных для [HANDLEJSON]

Тема в разделе "Функции поиск-замены и регулярные выражения", создана пользователем yup, 16 дек 2021.

  1. yup

    yup Member Пользователи

    Регистрация:
    20 июн 2012
    Сообщения:
    44
    Есть конструкция
    Код:
    [HANDLEJSON]
    {OUT_TEMPLATE}{LIST()}
    <PHP_SCRIPT=...>
    <HEADERS></HEADERS>
    N1={KEY()}
    ...
    </PHP_SCRIPT>
    {/LIST}{/OUT_TEMPLATE}
    {VALUES_REPLACE}{/VALUES_REPLACE}
    {PARAMS}values_json_decode{/PARAMS}
    {LIST_SEP}{br2}{/LIST_SEP}
    {JSON_DATA}
    
    <GETMORECONTENT></GETMORECONTENT>
    
    {/JSON_DATA}
    [/HANDLEJSON]
    Т.е. данные, которые потом разбирает [HANDLEJSON], подтягиваются ему в раздел DATA с помощью нескольких <GETMORECONTENT> с разной настройкой POST данных по одному и тому же источнику. И все хорошо работает пока внутри данных не встречаются поля типа
    Код:
    "location":{"city":"Москва","region":"","street":"\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\","lat":55.753819,"lon":37.609255,"geoCode":"2_3611","fullGeoName":"Москва, Москва (регион), Россия"}
    И вот на этих безумных пользовательских последовательностях обратных слешев структура JSON ломается. Т.е. при определенном колличестве таких слешев последний воспринимается как экранирующий кавычку, кавычка (со следующей за ней запятой) воспринимаются как пользовательские данные а не как ограничители полей и вся последующая структура JSON нарушается.

    И что то никак не могу убрать эти слеши до того как [HANDLEJSON] начнет разбирать полученные от <GETMORECONTENT> данные. Поиск-замена в окне по shift+ctrl+e срабатывает не тогда когда надо, пытался также <GETMORECONTENT> заключить в 3 варианта REPLACE (First, BEFORE_IMG и обычный) - тоже мимо, в этом случае [HANDLEJSON] вообще по ощущениям перестает видеть исходные данные.
    Правило замены использовал такое:
    \\{skip}\\|
    Помогите разобраться с этими экранированиями!
     
  2. Root

    Root Администратор Администратор

    Регистрация:
    10 мар 2010
    Сообщения:
    14.818
    Город:
    Барнаул
    Для выполнения поиск-замены в коде, который возвращает GETMORECONTENT используйте параметр GMC_REPLACE.
    Код:
    <GETMORECONTENT><URL="[SELF]"><GMC_REPLACE>123</GMC_REPLACE><START=""><STARTCOUNT="0"><END=""><ENDCOUNT="0"><PARAMS=""></GETMORECONTENT>
     
    yup нравится это.
  3. yup

    yup Member Пользователи

    Регистрация:
    20 июн 2012
    Сообщения:
    44
    Спасибо, помогло! Но остался непонятным нюанс со строкой замены. Длинную последовательность
    \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
    строка \\{skip}\\| правильно не убирает, так и воспринимаются последние слеш с закрывающей кавычкой как экранирование кавычки в данных и JSON ломается. Методом тыка сработала конструкция \\\{skip}\\| Почему так?

    Зы В исходном тексте еще встречаются кавычки в данных (т.е. не ограничители полей JSON) с соответсвующими одиночными экранирующими \, поэтому просто убирать все слеши (включая одиночные) или \{skip}\| будет неправильно т.к. опять же испортит структуру. Нужно именно последовательности от 2-х и более слешев. Как правильно написать строку такой замены? Если просто заменять два слеша на ничто (\\|) то при нечетном колличестве слешей останется один, который как раз все и испортит? Или не правильно я понимаю?
     
  4. yup

    yup Member Пользователи

    Регистрация:
    20 июн 2012
    Сообщения:
    44
    Чет перемудрил я, судя по всему. Самая простая конструкция \\| нормально работает для убирания от двух и более слешей и четность их или не четность значения не имеет.
     
    Root нравится это.

Поделиться этой страницей