26.03.2018 15:33
OlegON
 
Собственно, задача достаточно простая, вопрос в том, чтобы сделать это максимально красиво (оптимально по ресурсам и быстродействию).
В предложениях типа
Цитата:
Напомни завтра в обед ....
Напомни сегодня в 16:45 ....
убирать третье слово, если это "в"
Т.е. этот предлог там может быть, может его и не быть, но быть не должно
Цитата:
Напомни завтра обед ....
Напомни сегодня 16:45 ....
26.03.2018 16:34
student
 
как на пхп не знаю, но первое что приходит на на vbs
====================================
s0 = "Напомни сегодня в 16:45"
s = Split(s0, " ")
if s(2)="в" then
s0=Replace(s0, s(0) & " " & s(1) & " " & s(2) & " " & s(3), s(0) & " " & s(1) & " " & s(3))
end if
msgbox s0
====================================
можно еще вместо реплейса mid замутить - чтобы точно по размеру менять, а то реплейс все вхождения "сегодня в 16:45" заменит на "сегодня 16:45"если их будет несколько :)
26.03.2018 16:35
AndreyZh
 
В моём инструменте есть функашка
Цитата:
StrTran()
Searches and replaces characters within a character string or memo field.
Syntax
StrTran( <cString> , ;
<cSubString>, ;
[<cReplace>] , ;
[<nStart>] , ;
[<nCount>] ) --> cNewString

Arguments
<cString>
This parameter is the input string or memo field to search <cSubString> in.
<cSubString>
This is the character string to search for in <cString>.
<cReplace>
A character string <cSubString> is replaced with in <cString>. It defaults to an empty string (""), i.e. if <cReplace> is not specified, <cSubString> is removed from <cString>.
<nStart>
This is a numeric value indicating the first occurrence of <cSubString> to replace. The default value is 1.
<nCount>
This is a numeric value indicating the number of occurrences of <cSubString> to replace. If not specified, all occurrences of <cSubString> are replaced. Return
The function returns a copy of <String> where <cSubString> is replaced with <cReplace>.
Должна быть аналогичная в php, т.к. разработчики "пересекаются" и можно заменить, без учета многих нюансов:
StrTran( cString," в ")
26.03.2018 16:38
student
 
Цитата:
AndreyZh Searches and replaces characters within a character string
в данном случае заменит ВСЕ " в " строке если их несколько, а не только 3-е
если только 3-е то надо сначала делить по словам :)
26.03.2018 16:43
AndreyZh
 
Цитата:
AndreyZh ... и можно заменить, без учета многих нюансов: StrTran( cString," в ")
Цитата:
student в данном случае заменит ВСЕ " в " строке если их несколько, а не только 3-е если только 3-е то надо сначала делить по словам :)
Раз нужно точно
IF Token(cString," ",3) == "в"
cStr := StrTran( cString," в ","",,1)
ENDI
26.03.2018 16:55
twix
 
Код:
<?php

$strings = array("Напомни завтра в обед ....", "Напомни сегодня в 16:45 ....");

function unVail($string){
  $arr = explode(" ", $string);
  if ($arr[2] == "в") unset($arr[2]);
  return implode(" ", $arr);
}

foreach ($strings as $str) {
  echo unVail($str) . PHP_EOL;
}
26.03.2018 16:57
student
 
Цитата:
AndreyZh Раз нужно точно
"и не зачем так орать, я и в первый раз все прекрасно слышала" (из винипуха) :)

если бы был token сразу то и не было бы уточнения ...

хотя как оно отработает для строки " в тбьтбь в лорлорл" ?
вероятнее всего уберет первое вхождение т.к.

Цитата:
AndreyZh This is a numeric value indicating the first occurrence of <cSubString> to replace. The default value is 1.
<nCount>
26.03.2018 17:03
twix
 
Если ты парсилку для какой-то "умной" системы с распознаванием речи мастрячишь, то, может, имеет смысл, не "в лоб" строки разбирать, а маркеры завести?
Типа, пробегаешь по всем словам в предложении, и по маркерам "завтра/сегодня/в_субботу" создаёшь DateTime, в который надо будет операцию выполнить?
А то, вдруг, йода попадётся? "В полдень завтра посуду помыть напомни мне..."
26.03.2018 17:05
AndreyZh
 
Цитата:
student хотя как оно отработает для строки " в тбьтбь в лорлорл" ? вероятнее всего уберет первое вхождение т.к.
Вы правы. Тогда по колхозному:

cNew:=""
a:={}
for n := 1 to 3 do aadd(a,Token(cStr," ",n)
if a[3] == "в" then cNew:=a[1]+" "+a[2]
26.03.2018 17:08
student
 
Цитата:
AndreyZh Вы правы
без обид :) и не не надо Выкать ... я себя тогда совсем древним ощущать начинаю ...

Форум на базе vBulletin®
Copyright © Jelsoft Enterprises Ltd.
В случае заимствования информации гипертекстовая индексируемая ссылка на Форум обязательна.