Заменить слово завтра на дату в формате 19.01.2013

Тема в разделе "Решение различных задач по парсингу", создана пользователем dobroe utro, 18 янв 2013.

  1. dobroe utro

    dobroe utro New Member Пользователи

    Регистрация:
    15 янв 2013
    Сообщения:
    13
    Как заменить слово завтра на дату в формате 19.01.2013 ?
    Эдакий [CD_DATE_DD].[CD_DATE_MM].[CD_DATE_YYYY]+1 day :) но в функции поиска замены
     
    Последнее редактирование: 18 янв 2013
  2. Root

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

    Регистрация:
    10 мар 2010
    Сообщения:
    14.818
    Город:
    Барнаул
    Заменить слово "завтра" функцией поиск-замены на макрос подключенного скрипта (PHP_SCRIPT), который вернет дату.
    Как подключить скрипт Ссылки недоступны для гостей
    Функции поиск-замены Ссылки недоступны для гостей
     
  3. kagorec

    kagorec Администратор Команда форума Администратор

    Регистрация:
    3 янв 2011
    Сообщения:
    4.431
    Адрес:
    Latvia
    попробуйте такой конструктор :rolleyes:
    PHP:
    [REPLACE(завтро|<TOPRICE+1>[CD_DATE_DD]</TOPRICE>.[CD_DATE_MM].[CD_DATE_YYYY])]завтро лучше чем вчера[/REPLACE]
    п.с. хорошо если сработает как надо, в любом случае отпишите как решили проблемку
     
  4. nikolas1612

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

    Регистрация:
    27 ноя 2011
    Сообщения:
    439
    сам решал эту проблему. с небольшой вариацией - мне надо было получить дату вчерашнего дня.

    вот результаты моих изысканий, лучше не придумал.
    Код:
    [REPLACE(01-|{break}02-|01-{break}03-|02-{break}04-|03-{break}05-|04-{break}06-|05-{break}07-|06-{break}08-|07-{break}09-|08-{break}10-|09-{break}11-|10-{break}12-|11-{break}13-|12-{break}14-|13-{break}15-|14-{break}16-|15-{break}17-|16-{break}18-|17-{break}19-|18-{break}20-|19-{break}21-|20-{break}22-|21-{break}23-|22-{break}24-|23-{break}25-|24-{break}26-|25-{break}27-|26-{break}28-|27-{break}29-|28-{break}30-|29-{break}31-|30-{break})][CD_DATE_DD]-[/REPLACE][CD_DATE_DD].[CD_DATE_MM].[CD_DATE_YYYY]
    все работает кроме переходов между месяцами. но, в принципе, можно добавить и их следующей строкой замены. мне просто надоело писать бесконечную строку, и я ограничился "полумерами".

    P.S. насчет TOPRICE как-то не приходило в голову. думал, там только умножение работает.
     
    Последнее редактирование: 18 янв 2013
  5. Root

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

    Регистрация:
    10 мар 2010
    Сообщения:
    14.818
    Город:
    Барнаул
    В TOPRICE только умножение и работает, господин Kagorec сам придумал +1 ;)
     
  6. dobroe utro

    dobroe utro New Member Пользователи

    Регистрация:
    15 янв 2013
    Сообщения:
    13
    А kagorec то выдумщик оказывается :)
    Но сама идея мне понравилась, жаль что не работает, с умножением тоже. Видимо даты не обрабатывает.

    [REPLACE(завтра|[REPLACE(31|01{break}30|31{break}29|30{break}28|29{break}27|28{break}26|27{break}25|26{break}24|25{break}23|24{break}22|23{break}21|22{break}20|21{break}19|20{break}18|19{break}17|18{break}16|17{break}15|16{break}14|15{break}13|14{break}12|13{break}11|12{break}10|11{break}09|10{break}08|09{break}07|08{break}06|07{break}05|06{break}04|05{break}03|04{break}02|03{break}01|02{break})][CD_DATE_DD][/REPLACE].[CD_DATE_MM].[CD_DATE_YYYY])]<CD_GRAN_4!>[/REPLACE]
    -------для наглядности
    <CD_GRAN_4!> выводит слово "завтра"
    вся эта синяя портянка выводит сегодняшнюю дату +1 день

    Весь replace заменяет слово завтра на портянку в которой сегодняшняя дата плюсуется 1 днем вперед.

    В общем то работает, но на выходе получаю нужную дату но с левым кодом 20.01.2013)]завтра[/REPLACE]
    Наверное вариант с php был бы проще, но уж больно интересно попробовать силами самой программы.
     
  7. nikolas1612

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

    Регистрация:
    27 ноя 2011
    Сообщения:
    439
    Код:
    [REPLACE(завтра|[FIRST_REPLACE(31|01{break}30|31{break}29|30{break}28|29{break}27|28{break}26|27{break}25|26{break}24|25{break}23|24{break}22|23{break}21|22{break}20|21{break}19|20{break}18|19{break}17|18{break}16|17{break}15|16{break}14|15{break}13|14{break}12|13{break}11|12{break}10|11{break}09|10{break}08|09{break}07|08{break}06|07{break}05|06{break}04|05{break}03|04{break}02|03{break}01|02)][CD_DATE_DD][/FIRST_REPLACE].[CD_DATE_MM].[CD_DATE_YYYY])]<CD_GRAN_4!>[/REPLACE]
    получайте рабочий вариант. все проблемы были потому, что не надо мешать друг с другом, в одной формуле, 2 одинаковых макроса, срабатывающих одновременно. кто из них на долю секунды сработает первее, какая в этом закономерность - или это вообще рулетка - знает только автор программы. по логике, первым должен сработать макрос, идущий первым в строке. Ваша же формула подразумевает обратный порядок.

    ознакомьтесь с очередностью выполнения функций программы. очень полезная статья.

    P.S. хоть приведенный код и рабочий - обращаю Ваше внимание на явную "проблемность" его начальной части 31|01{break}30|31{break}. как мы все помним, 31 день имеется не во всех месяцах, а про февраль и говорить нечего. поэтому идеал достигается введением еще одной строки замены, которая будет учитывать очередность месяцев.
     
    Последнее редактирование: 19 янв 2013
  8. dobroe utro

    dobroe utro New Member Пользователи

    Регистрация:
    15 янв 2013
    Сообщения:
    13
    Смотрел я на этот FIRST_REPLACE, но что-то не попробовал.
    Пока не понял чем грозит 31, 1 и как это исправить, но то что есть работает, мои познания в использовании программы расширились
    В очередной раз вы мне помогаете, спасибо.
     
    Последнее редактирование: 19 янв 2013
  9. nikolas1612

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

    Регистрация:
    27 ноя 2011
    Сообщения:
    439
    проблема вот в чем. система замен предполагает наличие 31 дня в каждом месяце. наступает 30.06.2013. макрос замены благополучно превращает эту дату в "завтрашнюю" - 31.06.2012, и слово "завтра" в Вашем тексте приобретает вид 31.06.2012. К сожалению, в природе не существует 31.06.2013.
    значит, надо ввести еще одну строку замены, которая будет менять ошибочно полученные даты на верные. 31.06.2013 на 01.07.2013, 29.02.2013 на 01.03.2013 и т.д. всего 5 позиций (месяцы, в которых менее 31 дня).

    вот написал все это - сам проникся и наконец доделал то, что в свое время доделывать не стал. вот готовый код с учетом переходов между месяцами
    Код:
    [REPLACE(29.02|01.03{break}31.04|01.05{break}31.06|01.07{break}31.09|01.10{break}31.11|01.12)][BEFORE_IMG_REPLACE(завтра|[FIRST_REPLACE(31|01{break}30|31{break}29|30{break}28|29{break}27|28{break}26|27{break}25|26{break}24|25{break}23|24{break}22|23{break}21|22{break}20|21{break}19|20{break}18|19{break}17|18{break}16|17{break}15|16{break}14|15{break}13|14{break}12|13{break}11|12{break}10|11{break}09|10{break}08|09{break}07|08{break}06|07{break}05|06{break}04|05{break}03|04{break}02|03{break}01|02)][CD_DATE_DD][/FIRST_REPLACE].[CD_DATE_MM].[CD_DATE_YYYY])]<CD_GRAN_4!>[/BEFORE_IMG_REPLACE][/REPLACE]
    P.S. впрочем, расслабляться не стоит. есть еще проблема високосного года :D
     
  10. dobroe utro

    dobroe utro New Member Пользователи

    Регистрация:
    15 янв 2013
    Сообщения:
    13
    Радостно мне читать вас )))
     

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