Всем привет! У бота в вк есть проверка на команды, например массив с поступившей командой 'как дела?' или 'как делишки?', так вот. В первом варианте если написать 'тестим'. прилетают 2 сообщения сразу, а во втором варианте работает как часы, но.... По сути это говнокод, может у меня слов 10 будет на проверке, и каждый раз писать false !== mb_stripos($cmd, 'слово') - не вариант как-то. Пробывал массив внутри функции mb_stripos(), но не работает, работает только если вписать if(in_array($cmd, ['онлайн', 'online'])) , но работает только строго по команде. А надо чтобы искало из строки, например текст будет таким: "Всем привет это тест" - искомое слово ТЕСТ в строке. Ниже оба варианта работают, но как писал уже выше, в первом варианте слово 'тестим' посчитает дважды и скрипт отправит дважды сообщение. Вопрос: если альтернативные варианты или какой лучше оставить способ? Заранее благодарю. Вариант 1: PHP: $test = ['тест', 'тестим']; foreach($test as $key){ if(false !== mb_stripos($cmd, $key)){ $vk->sendMessage($peer_id, "тест лс беседы"); } } Вариант 2: PHP: if(false !== mb_stripos($cmd, 'тест') || false !== mb_stripos($cmd, 'тестим')){ $vk->sendMessage($peer_id, "тест лс беседы"); } }
В первом варианте, после выдачи сообщения боту ставь break и он дальше не будет ничего обрабатывать....
спасибо помогло. На другом форуме мне предложили такой ещё вариант, хз какой выбрать, чтобы быстро обрабатывал. PHP: $test = ['тест', 'тестим']; foreach($test as $key) { if(1 === preg_match('/' . $key . '/u', $cmd)) { $vk->sendMessage($peer_id, "тест лс беседы"); } }
mb_stripos() быстрее чем регулярка, если надо только проверить наличие. @Dyec ты сам понимаешь, почему два сообщения приходит? Если в строке если слово "тестим", то в ней так же есть слово "тест", потому что это часть слова "тестим". Если уже проверяешь на "тест" то нет смысла проверять на "тестим", Либо добавь пробелы до и после слова, чтобы проверять наличие целого слова "тест" и "тестим". Так же нужно будет добавить пробелы в начало и конец сообщения от пользователя, чтобы эта проверка работала если искомое слово находится в начале или в конце сообщения.
избавился теперь. На другом форуме подсказали, работает, то что мне нужно было! С регулярками слабоват я, если честно. А вот и сам код: PHP: $test = ['тест', 'тестим']; $pattern= implode('|', $test); if (preg_match('/'.$pattern.'/u', $cmd)) { $vk->sendMessage($peer_id, "тест лс беседы"); } про пробелы в курсе, просто бот должен в тексте реагировать на слова к примеру "привет как дела", на слово КАК ДЕЛА - он реагирует, если присутствует в тексте, или например ЧТО ДЕЛАЕШЬ, а к этим фразам синонимов много, шутки 3-5, а к другим и того больше, а значит массив нужен, что собственно и получилось. --- Добавлено --- спасибо, уже сделал. Выше написал решение. Про двойное сообщение я понял сразу и пробелы я тоже в курсе, ниже код, проще говоря бот реагирует пользователям если они даже не к нему обращались и не писали ему команду, проще говоря он вмешивается в диалог)) Вот кусок примера допустим реакции: PHP: $robot = [' бот', ' бот ', 'бот ', 'робот']; $pattern4 = implode('|', $robot); if($cmd == 'бот' || preg_match('/'.$pattern4.'/u', $cmd)) { //создаём базу ответов $attached = array('реакция 1', 'реакция 2'); $chbad = mt_rand (0, count($attached)-1); $vk->sendMessage($peer_id, $attached[$chbad]); } а там реакций много подобных.
@Dyec нет необходимости накидывать все варианты с пробелами. Достаточно одного варианта PHP: ' бот ' с пробелами с обоих сторон. Потом нужно добавить пробелы к команде, независимо от того, есть они там или нет PHP: $cmd = " $cmd "; после этого, слово "бот" будет найдено как отдельное слово в любом входящем сообщении, в котором оно есть. Если хочешь разную реакцию на "робот" и "бот", проверяй в цикле, начиная с самого длинного слова.
спасибо, уже сделал. Выше написал решение. Кому интересно вот пример реакции: PHP: $robot = [' бот', ' бот ', 'бот ', 'робот']; $pattern4 = implode('|', $robot); if($cmd == 'бот' || preg_match('/'.$pattern4.'/u', $cmd)) { //создаём базу ответов $attached = array('реакция 1', 'реакция 2'); $chbad = mt_rand (0, count($attached)-1); $vk->sendMessage($peer_id, $attached[$chbad]); } } спасибо за совет, у меня там одна реакция на бот с рандомными ответами, а так у меня там другие реакции например на: как дела или что делаешь, и .т.д.