PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи

Страниц (2): [1] 2 »

> Найдено сообщений: 27
LML Отправлено: 14 Ноября, 2022 - 19:56:05 • Тема: Помогите составить регулярку • Форум: Вопросы новичков

Ответов: 2
Просмотров: 1326

или
LML Отправлено: 11 Ноября, 2022 - 14:59:28 • Тема: Запись в файл: как до- или пере-записать столбец без перезаписи всей строки? • Форум: Вопросы новичков

Ответов: 7
Просмотров: 1614
Dorn пишет:
Скажите, пожалуйста, а если я хочу именно дописать, то как могу я это сделать?
Наверное, через file_put_contents, но пока знаний не хватает )


Конечно же, и лучше и проще будет использование file_put_contents.

PHP:
скопировать код в буфер обмена
  1. file_put_contents($fileName, $fileString, FILE_APPEND|LOCK_EX);


Флаг FILE_APPEND указывает, что дописывать необходимо в конец файла.
Флаг LOCK_EX блокирует запись данного файла одновременно кем-нибудь другим.

В Вашем случае можно только сменить тип доступа с w на a.



'w' - Открывает файл только для записи; помещает указатель в начало файла и обрезает файл до нулевой длины. Если файл не существует - пытается его создать.

'a' - Открывает файл только для записи; помещает указатель в конец файла. Если файл не существует - пытается его создать. В данном режиме функция fseek() не применима, записи всегда добавляются в конец.
LML Отправлено: 08 Ноября, 2022 - 21:46:23 • Тема: Рандомный выбор слова в строке. • Форум: Вопросы новичков

Ответов: 8
Просмотров: 1678
Vladimir Kheifets пишет:
По саоему опыту, советую Вам в своих реальных проект не использовать неактуальные версии PHP.
Переделки обходятся не дешево и многие не хотят за них платить.


Полностью с Вами согласен. Но.
То, что я делаю - это больше для себя. Скажем так - практические работы по самообразованию.
За этот проект мне никто ничего не платит, а плачу я сам за сервер.
Ну и самое главное, перевести проект даже на версию выше 5.6 - проблема из-за необходимости переписывать десятки (может даже сотни) обращений к базе из разных файлов. Вручную - это просто не стоит затраченного времени.

Как-то попробовал изменить файлы с mysql скриптом - легло всё Недовольство, огорчение
Больше и не пытаюсь.
LML Отправлено: 08 Ноября, 2022 - 20:25:59 • Тема: Рандомный выбор слова в строке. • Форум: Вопросы новичков

Ответов: 8
Просмотров: 1678
Vladimir Kheifets пишет:

Добрый день!
Верно, регуляркой не нужно (более дорогая), только вот функция preg_replace_callback это тоже регулярка. Попробуйте так (проверял на PHP 8.1) Удачи!


Спасибо Вам огромное!

Но на PHP 5.6, видимо, без регулярок не обойтись.

Пришлось заменить

на
PHP:
скопировать код в буфер обмена
  1. $buf = preg_split("//u", $inStr, null, PREG_SPLIT_NO_EMPTY);


И всё же, на preg_replace_callback не будет ли лучше?
Хотелось бы с этой функцией тоже разобраться.
LML Отправлено: 07 Ноября, 2022 - 14:20:13 • Тема: Рандомный выбор слова в строке. • Форум: Вопросы новичков

Ответов: 8
Просмотров: 1678
ALEN пишет:
https://www.php.net/manual/en/fu...ace-callback.php в замыкании делишь строку по пробелу, регуляркой не нужно (более дорогая), достаточно explode и потом получив случайное число от 0 до количества элементов в коллекции вытаскиваешь этот рандомный элемент и возвращаешь в строку


preg_replace_callback, действительно интересная функция. Но по ней что-то совсем мало информации, чтобы разобраться. Максимум, что у меня с ней получилось - это выбирать цвет.
Что-то я никак не могу понять, как правильно её применять.
Если можно - пожалуйста, приведите примеры, применительно к моему вопросу.
LML Отправлено: 09 Октября, 2022 - 18:59:06 • Тема: Рандомный выбор слова в строке. • Форум: Вопросы новичков

Ответов: 8
Просмотров: 1678
Для начала, чтобы было понятно, что мне нужно - покажу, что я сделал.

Допустим, имеется строка: Железнодорожный семафор имеет {красный|жёлтый|зелёный|синий|белый} свет свечения.
Мне нужно получить строку с одним рандомным цветом, либо исходную строку, если в ней нет вариантов выбора.
Я делаю так:

PHP:
скопировать код в буфер обмена
  1. $str = 'Железнодорожный семафор имеет {красный|жёлтый|зелёный|синий|белый} свет свечения.';
  2. //$str = 'Светофор отключён.';
  3.  
  4. if (strpos($str, '{') !== false) {
  5. $str = preg_split( "/[\{\}]/", $str);
  6. print_r ($str).PHP_EOL;
  7. $exp = explode('|', $str[1]);
  8. echo $str[0].$exp[mt_rand(0, count($exp)-1)].$str[2];
  9. } else {
  10. echo $str;
  11. }


Получается всё красиво:

CODE (htmlphp):
скопировать код в буфер обмена
  1. (
  2.     [0] => Железнодорожный семафор имеет
  3.     [1] => красный|жёлтый|зелёный|синий|белый
  4.     [2] =>  свет свечения.
  5. )


Цитата:
Железнодорожный семафор имеет жёлтый свет свечения.


А теперь мне нужно сделать выбор из двух (или более) массивов: Железнодорожный {светофор|семафор} имеет {красный|жёлтый|зелёный|синий|белый} свет свечения.

Я теперь получаю массив:

CODE (htmlphp):
скопировать код в буфер обмена
  1. (
  2.     [0] => Железнодорожный
  3.     [1] => светофор|семафор
  4.     [2] =>  имеет
  5.     [3] => красный|жёлтый|зелёный|синий|белый
  6.     [4] =>  свет свечения.
  7. )


И, в результате, не то что нужно Недовольство, огорчение

Цитата:
Железнодорожный семафор имеет


Вот тут я запутался.

Как определить какой элемент массива сам является массивом, чтобы произвести из него выбор?
Как обратно собрать строку, если число вариантов выбора и, соответственно, элементов массива может быть любым?
Подскажите, пожалуйста, как сделать такой выбор при тех же условиях?
И, вообще, я правильно решаю эту задачу?
LML Отправлено: 28 Мая, 2022 - 16:01:03 • Тема: Все ли буквы в строке - прописные? • Форум: Регулярные выражения

Ответов: 4
Просмотров: 1677
Спасибо всем огромное за идеи!

Vladimir Kheifets пишет:

Видимо Вы не обратили внимание на то, что ответили на вопрос от 09 Декабря, 2021

Вопрос, в принципе, ещё актуальный.
LML Отправлено: 08 Мая, 2022 - 04:07:57 • Тема: Обработка ошибок • Форум: Вопросы новичков

Ответов: 2
Просмотров: 745
Хенаро пишет:
Хочу чтобы если нет этого файла то подключало страницу ошибки или делало редирект на страницу ошибок.


В корневом .htaccess добавить строку

CODE (htmlphp):
скопировать код в буфер обмена
  1. ErrorDocument 404 /404.php
LML Отправлено: 09 Декабря, 2021 - 01:01:19 • Тема: Все ли буквы в строке - прописные? • Форум: Регулярные выражения

Ответов: 4
Просмотров: 1677
Задача - выдать предупреждение, если строка $umsg написана полностью прописными буквами.
Если в строке прописных букв меньше, чем их разрешённое количество, находятся цифры, или хоть одна строчная буква - предупреждения нет.
Я решил это таким способом:

PHP:
скопировать код в буфер обмена
  1. if(mb_strlen($umsg) > jjBot_Caps_Lock && preg_match('/^D+$/', $umsg) && mb_strtoupper($umsg) === $umsg) {


В конфиге задаётся


Вроде всё красиво. Но, если пишут просто знаки препинания или с пробелами, например А..... - условие срабатывает.
И ещё какой-то глюк с цифрами тоже вылезал. Пришлось заменить

на

А, чтобы не считались точки и пробелы - сделал так:
PHP:
скопировать код в буфер обмена
  1. if(mb_strlen(preg_replace('/[[:punct:][:blank:]]/', '', $umsg)) > jjBot_Caps_Lock && !preg_match('/\d+/u', $umsg) && mb_strtoupper($umsg) === $umsg) {


Я не силён в регулярках, поэтому вопрос - нормально сделано условие, или его можно упростить, чтобы было меньше регулярок в одном условии?
LML Отправлено: 16 Июня, 2021 - 14:13:59 • Тема: Создание игры "Угадай число" • Форум: Уроки php

Ответов: 26
Просмотров: 1705
На основе вышеприведённых решений задумал встроить "угадайку" в бота.

Задача:
1. Боту приходит фраза с ключевым словом из массива $chislo.
2. Бот переходит в режим ожидания ввода цифр.
3. Если цифры в введённой фразе есть - обрабатывает их. Если нет - обрабатывает фразу, как обычно.
4. Если сразу есть совпадение - поздравляет.
5. Если нет совпадения - в цикле проверяет каждый последующий ввод, пока цифра не совпадёт, либо её вообще не будет в сообщении.
6. При совпадении - выходит из цикла и выводит поздравление.

Как я пытаюсь сделать:

PHP:
скопировать код в буфер обмена
  1. // $umsg = 'игра';
  2.  
  3. $chislo = ['угадать число','игра','угадайк'];
  4.                 if(str_ireplace($chislo, '', $umsg) !== $umsg) {
  5.                 echo "Ну что, сыграем? Я загадал число от 1 до 100. Попробуйте его угадать.";  
  6.  
  7.  //Тут получаем $umsg = 'строка, содержащая число';
  8.  
  9.         $umsg = preg_replace('/\D+/', '', $umsg);
  10.                 if(is_numeric($umsg)) {
  11.                 $rand_chislo = mt_rand(1, 100);
  12.                
  13.         //      $rand_chislo = 33;     
  14.                
  15.                         if($rand_chislo == $umsg) {echo 'Угадал '.$rand_chislo.'!';                    
  16.         } else {               
  17.  
  18.   if($rand_chislo > ($umsg - 10) && $rand_chislo < ($umsg + 10)) {echo 'Рядом';
  19.   }
  20.     elseif ($umsg < $rand_chislo) {echo 'Твоё Меньше';
  21.                 }
  22.                         elseif ($umsg > $rand_chislo) {echo 'Твоё Больше';
  23.                         }
  24. }
  25.         } else {
  26.         echo 'Не число';
  27.         }      
  28. }


По частям всё работает (проверяю в песочнице).

Но есть вопросы.
Как зациклить перебор вариантов, чтобы не выбрасывало после первого прохода?
Наверное, как-то через

Но не пойму, как сделать, чтобы после неправильного ответа ожидалась новая переменная $umsg и цикл повторялся до выполнения условия.

Или может лучше записывать загаданное число в файл, а после правильного ответа - удалять его? А пока файл существует, сравнивать вводимое значение и записанное?
LML Отправлено: 11 Июня, 2021 - 12:12:26 • Тема: Частичное совпадение во вложенном массиве • Форум: Вопросы новичков

Ответов: 7
Просмотров: 587
2 Мелкий Первый раз слышу об этом. Почитал. Интересно.
Даже нашёл алгоритм реализации обратной польской нотации https://github[dot]com/vasilenko-s/A[dot][dot][dot]lishNotation.php
Буду разбираться...

2 Vladimir KheifetsВстречал я подобные способы реализации. Но везде пишут - использовать только в обучающих программах! eval(), штука жутко нехорошая... А у меня кто угодно боту написать может.
LML Отправлено: 11 Июня, 2021 - 07:13:38 • Тема: Частичное совпадение во вложенном массиве • Форум: Вопросы новичков

Ответов: 7
Просмотров: 587
2 don.bidon Спасибо за помощь!
Пока я пытался решить проблему "в лоб", в голову пришло решение "в обход" - если мы получаем пару, или тройку массивов одновременно, просто переспрашиваем: "Из твоего вопроса я никак не могу понять, что ты хочешь прочитать - анекдот, афоризм, или цитату?"

2 Vladimir Kheifets Да. Вы угадали. Я пишу чат-бота. Даже не пишу, а модернизирую готовый плагин. На ИИ эта работа явно не тянет. И тех функций, что ему вкладываю - вполне достаточно, чтобы развлекать посетителей моего чата. То, что я пишу, даже в таком виде круче того, что было изначально, когда ответы на каждую реплику выбирались через if-else-strpos А?!
Если интересно, все мои доработки бота описаны тут: https://netsearch[dot]club/threads/j[dot][dot][dot]page-2#post-9229

Да. Моих знаний php явно не достаточно, чтобы писать что-то сложнее массивов с ключевыми словами. Я ведь не программист, а вот так и изучаю php, модернизируя свой чат.

Кстати, что вы можете сказать по поводу решения ботом задач по арифметике?
PHP:
скопировать код в буфер обмена
  1. $str = 'fdhdhf222-95=ппрлплрд';
  2. $s = preg_replace('/[^\d\+\-]+/', '', $str);
  3. echo "Ответ: ",$s;
  4.  
  5. $n = sscanf($s, "%d %d", $first, $last);
  6. $f = (float)$first+$last;
  7.  
  8. echo "= ",$f;

Сложнее сложения/вычитания мне получить не удалось.
Никак не могу вытащить из строки знаки математических действий и загнать их в переменную.

И по поводу, если кто захочет более сложное выражение.
Типа
PHP:
скопировать код в буфер обмена
  1. $umsg = 'fdhdhf222+95-7=ппрлплрд';


Я решил это, изменив часть
PHP:
скопировать код в буфер обмена
  1. $n = sscanf($s, "%d %d %d", $first, $last, $end);
  2. $f = $first+$last+$end;


А, если кто больше слагаемых подставит? Как поступить тут?
Или, хотя-бы ответить, что "Я такие длинные примеры не умею решать".
LML Отправлено: 10 Июня, 2021 - 16:36:48 • Тема: Частичное совпадение во вложенном массиве • Форум: Вопросы новичков

Ответов: 7
Просмотров: 587
Здравствуйте!

Нужно по частичному совпадению слова из фразы выдать то ли анекдот, то ли афоризм, то ли цитату.

Я решил эту задачу таким образом:

PHP:
скопировать код в буфер обмена
  1. $story = array('anekdot' => array('анекдо','анегдо','юмор','смеш','весели'),
  2.                'aforszm' => array('афори','изречен','умняк'),
  3.                'citata'  => array('цитата','цитиру','скажи'));
  4.  
  5. foreach ($story as $key => $val) {
  6.       foreach ($val as $v) {
  7.          if(mb_stripos($umsg, $v) !== false) {
  8.              
  9.         echo $key;
  10.         break;
  11.         }
  12.     }
  13. }


В таком виде всё работает. Но только, если в тексте есть одно совпадение с ключевым словом.

Если фраза будет такой:
PHP:
скопировать код в буфер обмена
  1. $umsg = 'Процитируй мне смешное знаменитое изречение';

Получаю сразу все ключи: anekdotaforszmcitata

Подскажите, как мне сделать, чтобы срабатывало только на одно ключевое слово?

И оцените, пожалуйста сам код. Может его можно улучшить?
И как этот массив правильно записать коротким синтаксисом? Что-то я в этих квадратных скобках запутался. Одни ошибки получаются...
LML Отправлено: 10 Апреля, 2021 - 11:33:25 • Тема: Дорогие, срочно нужна ваша помощь№2 • Форум: Напишите за меня, пожалуйста

Ответов: 2
Просмотров: 68
Если я правильно понял задание, получить что-то типа такого:

    Случайный сезон: Летом: 17°C

    Среднесуточная температура по месяцам:
    Зимой: -10°C
    Весной: 2°C
    Летом: 17°C
    Осенью: 9°C

    Среднегодовая температура: 1,5°C

    Array ( [Зимой] => -10 [Весной] => 2 [Летом] => 17 [Осенью] => 9 )

То сделал бы так:

PHP:
скопировать код в буфер обмена
  1. $god = array();
  2. $god['Зимой'] = mt_rand(0,30)-30;
  3. $god['Весной'] = mt_rand(0,17)-2;
  4. $god['Летом'] = mt_rand(15,35);
  5. $god['Осенью'] = mt_rand(0,12)-2;
  6.  
  7. $key = array_rand($god);
  8. $rnd_sezon = $key.': '.$god[$key];
  9.  
  10.   echo 'Случайный сезон: ';
  11.   echo $rnd_sezon,'&deg;C<br><br>';
  12.  
  13.   echo 'Среднесуточная температура по месяцам:<br>';
  14. foreach($god as $sezon => $temperatura) {
  15.   echo $sezon,': ',$temperatura,'&deg;C<br>';
  16. }
  17.   echo '<br>';
  18.   echo 'Среднегодовая температура: ';
  19. $temp_god = round(array_sum($god)/12, 1);
  20.   echo $temp_god,'&deg;C<br><br>';
  21.  
  22.   print_r($god);
LML Отправлено: 06 Апреля, 2021 - 15:15:39 • Тема: Помогите устранить ошибки • Форум: Вопросы новичков

Ответов: 5
Просмотров: 610
Vladimir Kheifets спасибо огромнейшее за помощь!
Жаль, что не могу ещё плюсики ставить Недовольство, огорчение((

Код красивый получился, не спорю. Но одно НО...
Файл common_body_start.php нельзя кардинально изменять. Он десятки раз подключается во всех php файлах. И везде нормально, через include.
И только в voc.php встраивается вот таким вот способом в JavaScript.

Похоже, нужно возвращать первоначальный вариант и парить мозги никому Недовольство, огорчение(

Страниц (2): [1] 2 »
Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB