«phpClub» — архив тем ("тредов"), посвящённых изучению PHP и веб-технологий.
Аноним 2019/04/09 17:40:46  №1377929 1
Анончик помогающий с регулярками, глянь, где я не прав. https://ideone.com/S53UAG Решение я обосновал так, с начала я выкидываю к хуям все кроме цифр. Теперь нам не принципиально что в начале, затем проверяем число знаков и наконец проверяем что в начале 7 или 8, потом сразу же меняем 7 на 8мь. Я не могу понять почему на этапе проверки первых цифр происходит ошибка.
Ответы: >>1378083 >>1378169
Аноним 2019/04/09 19:18:46  №1377979 2
>>1353705 (OP)
Ох уж эта ебля с настройками, не могу направлять запросы через ФронтКонтроллер. Если на прямую к нему обращаться, то создает роутер и выполняет функцию из класса роутера. Чего я только не делал. И закидывал в стандартный путь, и новый адресс делал, и разные htaccess создавал, и переустанавливал ос. Уже не понимаю куда смотреть.
php7.2 Апач2.4 на виртуалке ubuntu 18.04.
Это в .htaccess:
"AddDefaultCharset utf-8

RewriteEngine on
RewriteBase /
RewriteRUle ^(.*)$ index.php"
Ответы: >>1378163 >>1378169
Аноним 2019/04/10 05:37:31  №1378169 3
>>1377979

А в чем проблема? В том, что не вызывается index.php?

Для начала проверь, включено ли в конфиге Апача выполнение htaccess:

- https://httpd.apache.org/docs/2.4/mod/core.html#allowoverride
- https://www.linode.com/docs/web-servers/apache/how-to-set-up-htaccess-on-apache/

Не забудь, что после изменения конфига надо перезапустить Апач.

Далее, глянь в лог ошибок веб-сервера (/var/log/apache2 или /var/log/httpd). Посомтри, нет ли там чего странного.

>>1377929

Там в начале может быть либо +7, либо 8. Если просто 7 или +8 - то это ошибка. Также, выкидывать лучше не все, а только пробелы, скобки, минусы. Ну а еще лучше все же написать полноценную регулярку для проверки:

- в начале идет 8 или +7
- затем выражение (одна цифра, за ней любое число скобок, минусов, пробелов), которое повторяется 11 раз

Далее, у тебя ошибки в коде:

> \tif (mb_substr ($clearNum,0,1)=='/7|8/'){

Знак "равно" просто делает посимвольное сравнение, он не интерпретирует выражение как регулярку. Тебе тут нужен preg_match.
Ответы: >>1378186 >>1378542
Аноним 2019/04/10 16:41:58  №1378542 4
Ответы: >>1378586 >>1380459
Аноним 2019/04/10 18:01:45  №1378586 5
>>1378542
Буквы-флаги. В начали урока по регуляркам. Вместо /[a-zA-Z]/
можно написать /[a-z]/i
Если используешь русские буквы в выражении - ставь флаг 'u'.
/[а-яё]/iu
Так же у тебя по условию нужно проверить является ли строка номером. У тебя она является номером, хотя содержит "позвать Люсю".
Ответы: >>1378663
Аноним 2019/04/10 18:44:18  №1378663 6
>>1378586
Окей понял. За флаги спасибо, а то только через 101 проверил, а там автоматом проверяется. Перепсал с первичной проверкой любого текста. Но теперь почему-то выражение принимается в любом случае вне зависимости от того есть в нем буквы или нет (я писал только русские). http://sandbox.onlinephpfunctions.com/code/cce3879a8929314360111bd939069d09b7020410
Ответы: >>1378756 >>1380459
Аноним 2019/04/10 19:28:37  №1378756 7
>>1378663
Есть несколько моментов:

-в PHP есть функция preg_match($regexp, $text, $match). Она принимает на вход регулярку, текст и пустой массив. Она проверяет, есть ли в тексте подстрока, соответствующая данному шаблону и возвращает 0, если нет, или 1, если она есть.
If (preg_match('/[a-z]/',$text)), если функция найдет что нибудь по регулярному выражению - вернет 1. В обратном же случае вернет 0.
if (1) - Правда, идем дальше
if (0) - Ложь, переходим к Else.

-https://regex101.com/r/qF7vT8/3
Видишь, твоё регулярное выражение не очень то и работает. Должны светиться только ВСЕ правильные номера.

-Читай внимательнее уроки и задачки.

-Сделай сначала первую часть задания, где программа должна из массива номеров выдавать только правильные, а только потом преступай к их форматированию
Ответы: >>1378833
Аноним 2019/04/10 20:46:02  №1378833 8
Ответы: >>1378889
Аноним 2019/04/10 21:52:59  №1378889 9
>>1378833
А теперь сделай чтобы скрипт массив номеров проверял. Исходник массивов в задании есть.
Ответы: >>1379314
Аноним 2019/04/11 16:36:33  №1379314 10
>>1378889
Сделал, глянь, https://ideone.com/v2XnwF. Дуболомно, но пашет. Я сейчас кстати сам с себя проиграл, половина номеров повторяются, а я думал, что один и тотже в цикле идет
Ответы: >>1379319 >>1380458
Аноним 2019/04/11 16:49:32  №1379319 11
Ответы: >>1379321 >>1379335
Аноним 2019/04/11 16:55:07  №1379321 12
Аноним 2019/04/11 17:15:07  №1379335 13
>>1379319
Раз все работает - можешь дальше задачки решать. Я сам только учусь, так что могу подсказать только то, что сильно выделяется. Например "грамматика", если ее можно так назвать
Вот как тут >>1353706 пытайся делать. Скобки, пробелы в блоках.
Чтобы код был более правильно оформлен
Ответы: >>1379355
Аноним 2019/04/11 17:42:46  №1379355 14
>>1379335
Согласен, но со скобками пришлось так сделать т к я изначально накосячил с ними и подбивал куда нужно, спасибо тем не менее
Аноним 2019/04/13 18:19:04  №1380458 15
>>1379617

Да, HTTP-код предназначен для роботов и программ, и они его используют.

>>1379411

Сейчас оба регекспа работают. Надо учесть, что на regex101 немного другие флаги (в PHP нет флага global), и могут быть немного другие правила использования бекслешей (в PHP сначала обрабатываются бекслеши как часть синаксиса записи строк, а потом в том, что останется, обрабатываются бекслеши как часть регулярки).

>>1379090

Этот тест проверяет знание Битрикса. Если ты с ним каждый день работаешь, то ты и так знаешь ответы на эти вопросы.

ООП и паттерны запоминаются, если не заучивать их наизусть, а попытаться разобраться и понять, зачем это нужно и как бы ты сам бы решил такюу задачу.

Гордиться низким уровнем знаний и нежеланием развиваться довольно странно.

>>1379314

Решено верно, но.

> if (preg_match('/^(\+7)/',$checkNum)) {
> $checkNum=preg_replace('/^(\+7)/',8,$checkNum);
Тут сразу можно делать preg_replace без предварительной проверки.

И по тестированию: лучше не просто писать, что номер верный/неверный, а сразу добавлять, правильно ли определила его программа или нет. Так как сейчас у тебя надо вручную читать то, что вывели программа, чтобы проверить, что она правильно определяет номера.
Аноним 2019/04/13 18:19:38  №1380459 16
>>1378663

> Но теперь почему-то выражение принимается в любом случае вне зависимости от того есть в нем буквы или нет (я писал только русские).

У тебя стоит звездочка, которая значит, что предыдущий символ может встретиться 0 или более раз. Даже если в строке нет букв, это соответствует условию "0 раз". Под твою регулярку вообще любая строка подходит, даже пустая строка.

Надо убрать зведочку либо заменить ее на плюс.

>>1378542

Чтобы регулярка корректно работала с нелатинскими символами в кодировке utf-8 (а у тебя она), надо ставить флаг u. Иначе регулярка думает, что перед ней текст в 1-байтовой кодировке, а русская буква - это 2 отдельных символа (так как она кодируется 2 байтами в utf-8). Описано тут: https://github.com/codedokode/pasta/blob/master/php/strings-utf8.md

>>1379192

const появился в PHP7, а книга наверно написана раньше. Лучше использовать const.

>>1378611

Это способ записи больших строк. Можно использовать кавычки, а можно heredoc. Ты бы документацию вместо книги почитал бы, например:

- https://www.php.net/manual/ru/language.types.string.php
- https://ru.wikipedia.org/wiki/Heredoc-%D1%81%D0%B8%D0%BD%D1%82%D0%B0%D0%BA%D1%81%D0%B8%D1%81

Главный плюс в том, что в нем можно использовать кавычки и/или спецсимволы без экранирования, что удобно. К тегу <pre> он отношения не имеет.

>>1378531

Есть очереди задач для этого.
Ответы: >>1381843 >>1381844
Аноним 2019/04/15 13:56:36  №1381843 17
>>1380459
>Есть очереди задач для этого.
Ты имеешь в виду какой-нибудь rabbitmq? Из пушки по воробьям же. Мне нужно просто отправить юзеру view сразу, до того как долгий таск завершится. Я до этого писал всякую шляпу на fat free framework и там есть функция abort, которая делает нужное
https://fatfreeframework.com/3.6/base#abort
Я вполне способен залезть в исходники и посмотреть, что она там делает и перенести это в симфони, но ведь скорее всего это уже там есть и мой велосипед всяко будет хуже.
Ответы: >>1388215 >>1388213
Аноним 2019/04/15 14:00:02  №1381844 18
>>1380459
>Есть очереди задач для этого.
Ты имеешь в виду какой-нибудь rabbitmq? Из пушки по воробьям же. Мне нужно просто отправить юзеру view сразу, до того как долгий таск завершится. Я до этого писал всякую шляпу на fat free framework и там есть функция abort, которая делает нужное
https://fatfreeframework.com/3.6/base#abort
Я вполне способен залезть в исходники и посмотреть, что она там делает и перенести это в симфони, но ведь скорее всего это уже там есть и мой велосипед всяко будет хуже.
Аноним 2019/04/25 02:21:36  №1388213 19
>>1380688

> Ну и разные функции нет смысла создавать - всегда один гет-массив приходит в запросе и с ним работаем.

Суть не в том, что ты создаешь эту анонимную функцию всего один раз. Суть в том, что это можно было сделать нормально аж несколькими способами:

- не использовать анонимную функцию, а использовать объект, каждый генератор ссылок - это новый объект
- использовать анонимную функцию, но хранить данные в замыкании, а не в $this, так что каждая функция изолирована от других

Любой из этих вариантов решил бы проблему нарушения изоляции генераторов ссылок друг от друга. Ты же выбрал плохой вариант, который может вызвать баг, и вместо исправления пишешь о том, что ты создаешь всего лишь 1 генератор. Это так не делается. В реальном проекте завтра кто-то попробует создать второй генератор ссылок и получит баг. Не надо писать такой код, который легко использовать неправильно и получить баг.

>> если мы меняем сортировку, то надо сбрасывать пагинацию
> Зачем? Количество записей ведь не изменилось.

Обычно сортировку используют, чтобы показать, например, самые большие или самые маленькие баллы. Или первые фамилии по алфавиту. Для этого надо перейти на 1-ю страницу при смене сортировки. Если ты меняешь сортировку и оставляешь ту же страницу, то не очень понятно, для чего это нужно. Ты не получаешь ни самые большие, ни самые маленькие баллы, а что-то из середины списка.

Везде переключают на первую страницу при смене сортировки, насколько я знаю.

>>1381843

Этот подход довольно плохой. Он мне не нравится. Во-первых, не всегда это работает, зависит от конфигурации сервера, и может получиться, что у юзера будет крутиться кружок загрузки, пока твой скрипт что-то там считает якобы в фоне. Во-вторых, php-fpm на такое не рассчитан. Там может быть ограничено число рабочих процессов, и в неудачном случае они все могут оказаться заняты этими вычислениями и некому будет обслуживать другие запросы пользователей. В-третьих, тут нет обратной связи - ты запустил вычисление, а чем оно закончилось, неизвестно. Также, часто на php-fpm ставится таймаут на время работы скрипта.

Если у тебя какой-то простой случай, не требующий очереди задач, редко вызваемый (типа генерации какого-то отчета, который генерируется минуту), то проще просто сделать страницу с кнопкой и кнопкой запрашивать скрипт аяксом, а тот скрипт генерирует отчет и возвращает. Тут ты хотя бы в итоге либо получишь отчет, либо какую-то ошибку и можно будет нажать кнопку еще раз.
Аноним 2019/04/25 02:26:21  №1388215 20