Шаблоны поведения и $matches

Использование системы в различных ситуациях, вопросы программирования сценариев.

Модератор: immortal

Ответить
Аватара пользователя
xor
Сообщения: 2045
Зарегистрирован: Сб ноя 22, 2014 8:45 pm
Благодарил (а): 289 раз
Поблагодарили: 633 раза

Шаблоны поведения и $matches

Сообщение xor » Пн ноя 21, 2016 10:39 pm

есть шаблон типа Повтори
тест (.+)
Код:

Код: Выделить всё

say('$matches0 '.$matches[0]);
say('$matches1 '.$matches[1]);
say('$matches2 '.$matches[2]);
say('$matches3 '.$matches[3]);
say('$matches4 '.$matches[4]);
say($matches[1]);
Лог:
22:31 Алиса: 1 2 3 4 5 6 конец
22:31 Алиса: $matches4
22:31 Алиса: $matches3
22:31 Алиса: $matches2
22:31 Алиса: $matches1 1 2 3 4 5 6 конец
22:31 Алиса: $matches0 тест 1 2 3 4 5 6 конец
22:31 Сергей: тест 1 2 3 4 5 6 конец

Всё хорошо.

Есть другой шаблон - напомни через (\d+) минут(.?) (.+)
Код:

Код: Выделить всё

$rnumber = 1;
while (1) {
  $rname = "Reminder_$rnumber";
  if (!timeOutExists($rname)) break;
  $rnumber++;
}
say('original '.$original);
say('0 '.$matches[0]);
say('1 '.$matches[1]);
say('2 '.$matches[2]);
say('3 '.$matches[3]);
say('4 '.$matches[4]);

$nmin = morph($matches[1],'минуту','минуты','минут');
setTimeOut($rname,'sayReply("Напоминаю: '.$matches[3].'",5);',$matches[1]*60); 
say("Принято напоминание - напомнить через $matches[1] ".$nmin.": $matches[3]",2);
say("Постараюсь не забыть!",2);
Лог:
22:37 Алиса: Напоминаю: 1 2 3 4 5 6
22:35 Алиса: Постараюсь не забыть!
22:35 Алиса: Принято напоминание - напомнить через 2 минуты: 1 2 3 4 5 6
22:35 Алиса: 4
22:35 Алиса: 3 1 2 3 4 5 6
22:35 Алиса: 2 ы
22:35 Алиса: 1 2
22:35 Алиса: 0 напомни через 2 минуты 1 2 3 4 5 6
22:35 Алиса: original напомни через 2 минуты 1 2 3 4 5 6 конец
22:35 Сергей: напомни через 2 минуты 1 2 3 4 5 6 конец

Вопрос - куда подевалось слово конец?
Аватара пользователя
xor
Сообщения: 2045
Зарегистрирован: Сб ноя 22, 2014 8:45 pm
Благодарил (а): 289 раз
Поблагодарили: 633 раза

Re: Шаблоны поведения и $matches

Сообщение xor » Вт ноя 22, 2016 10:35 pm

Ап!
Драматизируем ситуацию:

Д.Бонд, проверяя работу датчика цианидов для МЖД, принимает яд и просит Алису напомнить о противоядии:

22:14 Бонд: напомни через 5 минут не забыть обязательно выпить противоядие
деталиПоказать
22:14 Алиса: original напомни через 5 минут не забыть обязательно выпить
противоядие
22:14 Алиса: matches0 напомни через 5 минут не забыть обязательно выпить
22:14 Алиса: matches1 5
22:14 Алиса: matches2
22:14 Алиса: matches3 не забыть обязательно выпить
22:14 Алиса: Принято напоминание - напомнить через 5 минут: не забыть обязательно выпить
прошло 5 минут

22:19 Алиса: Напоминаю: не забыть обязательно выпить

Д.Бонд, увлеченный разбором логов, на автомате глотает водку-мартини...
the end

Только у меня теряется последнее слово в $matches?
olehs
Сообщения: 1115
Зарегистрирован: Вс июн 14, 2015 11:08 am
Благодарил (а): 85 раз
Поблагодарили: 342 раза

Re: Шаблоны поведения и $matches

Сообщение olehs » Ср ноя 23, 2016 12:16 am

Код: Выделить всё

(Н|н)апомни через (\d+) минут(|у|ы) (.+) 

Код: Выделить всё

$rnumber = 1;
while (1) {
  $rname = "Reminder_$rnumber";
  if (!timeOutExists($rname)) break;
  $rnumber++;
}

setTimeOut($rname,'say("Напоминаю: '.$matches[4].'", 1);',$matches[2]*60); 
say("Создано напоминание через $matches[2] минут$matches[3]: $matches[4]", 1);
//say("Постараюсь не забыть!", 1);   

Код: Выделить всё

23:11 Алиса: Напоминаю: 1 2 3 4 5 6 конец
23:09 Алиса: Создано напоминание через 2 минуты: 1 2 3 4 5 6 конец
23:09 Олег: напомни через 2 минуты 1 2 3 4 5 6 конец
:?
За это сообщение автора olehs поблагодарили (всего 2):
xor (Ср ноя 23, 2016 1:40 am) • Sensei (Чт фев 23, 2017 11:46 am)
Рейтинг: 2.33%
Аватара пользователя
xor
Сообщения: 2045
Зарегистрирован: Сб ноя 22, 2014 8:45 pm
Благодарил (а): 289 раз
Поблагодарили: 633 раза

Re: Шаблоны поведения и $matches

Сообщение xor » Ср ноя 23, 2016 1:40 am

Хм, скопировал полностью ваш шаблон и код.
Все равно у меня теряется последнее слово.

Но, благодаря вашему ответу, понял, что должен копаться у себя.
Спасибо.

зы. в конце напоминания буду говорить Прием!
Аватара пользователя
xor
Сообщения: 2045
Зарегистрирован: Сб ноя 22, 2014 8:45 pm
Благодарил (а): 289 раз
Поблагодарили: 633 раза

Re: Шаблоны поведения и $matches

Сообщение xor » Ср ноя 23, 2016 2:07 am

Для себя решил так:

Код: Выделить всё

$rnumber = 1;
while (1) {
  $rname = "Reminder_$rnumber";
  if (!timeOutExists($rname)) break;
  $rnumber++;
}
  $mystr = 'я должна что-то напомнить!';
  //вырежем из оригинала напоминание
  $pos = strpos( $original,$matches[4]);
  if(!$pos===false){
          $mystr = substr($original,$pos);
  }
setTimeOut($rname,'say("Напоминаю: '.$mystr.'", 2);',$matches[2]*60); 
say("Создано напоминание через $matches[2] минут$matches[3]: $mystr", 2);
 
Ответить