«phpClub» — архив тем ("тредов"), посвящённых изучению PHP и веб-технологий.
Аноним 2018/11/16 16:34:38  №1296391 1
Анончики, нужда для облегчения работы цикличных действий приспичила и решил я по изучать работу с API с помощью JavaScript, и сразу же проглотил немытого хуя.

Как оказалось, работать с ним без серверного языка можно только с того же домена, на котором ты и исполняешь скрипт, то есть чтобы JS получил данные с внешнего домена, нужно чтобы на этом домене было прописано разрешение в заголовке для таких работ, но хуй там. Все костыли что я опробовал не работают, все выдают No 'Access-Control-Allow-Origin' header is present on the requested resource.

И тут меня осенило, я же могу не ебаться с серверами и их арендой, а запустить сервер прямо у себя на пекарне и с помощью животворящего PHP сделать проксирование всего этого дерьма, отсюда вопрос, как это сделать?

Знаю что для начала мне нужно будет прописать в самом коде <?php header('Access-Control-Allow-Origin: *'); ?> чтобы таки разрешить к нему доступ из вне, теперь я не пойму как организовать проксирование.

Например ссылка на API http://site.ru/api.json?token=224&user=1488 я создаю на локальном сервере файл proxy.php и обращаюсь к нему с нужного мне сайта из JavaScript с помощью XMLHttpRequest() например так http://localhost/proxy.php?token=224&user=1488 и он возвращает мне JSON с выше указанного API, подскажите пожалуйста как такой костыль реализовать, это у меня будет как-бы такой локальный JavaScript помощник для парсинга APIда благословит вас аллах

Ну или подскажите как таки наебать ограничение Cross-Origin Read Blocking (CORB) в браузере
Ответы: >>1296411 >>1296437 >>1297084
Аноним 2018/11/18 07:31:36  №1297070 2
image.png (169, 482x358)
358x482
Ответы: >>1297487
Аноним 2018/11/18 08:38:20  №1297084 3
>>1296391
>И тут меня осенило, я же могу не ебаться с серверами и их арендой, а запустить сервер прямо у себя на пекарне
Поехавший. Если в кратце - затея хуйня.
Купи себе вдс за 3 доллара и не еби мозги
Ответы: >>1297146
Аноним 2018/11/18 08:49:18  №1297089 4
Screenshot111.png (11, 627x299)
299x627
Screenshot112.png (23, 811x496)
496x811
Screenshot113.png (7, 490x213)
213x490
Насколько я конченый?
Я придумал унаследоваться от ArrayObject'а и прикрутить ему в конструктор проверку типа элементов передаваемого ему массива.
А сам тип задается в дочернем классе.

Таким образом, у меня происходит реальный контроль типа и я точно знаю, что в MessageArray будут только объекты Message.
Я могу задать тайпхинт возвращаемого значения : MessageArray и в принимающем методе быть уверенным, что в том, что мне прилетело будет то, что надо.

Но теперь другая беда. IDE не ебет, что у меня в этом месседж аррее будут только объекты Message.
При итерации через foreach() показывается какое-то говно, а не содержимое класса Message.
Что делать?
То есть, вопрос чисто про подсветку в IDE.
Ответы: >>1297104 >>1297487
Аноним 2018/11/18 10:19:52  №1297146 5
>>1297084
Нахуя что-то покупать и ебаться с его настройкой, если можно запустить трёхстрочный код проксирования локально?
Ответы: >>1297487
Аноним 2018/11/18 23:50:59  №1297487 6
>>1297146

Так проще тогда и код скачивания засунуть в PHP, а не городить схемы с проксированием, как мне кажется. Или писать на ноде, где есть JS, но нет ограничений.

>>1297089

Проблема с ArrayObject в том, что данные в него можно передать не только через конструктор, но и через методы. А ставя в них ограничения, ты нарушаешь принцип Лисков.

Потому ArrayObject надо оборачивать:

class MessagesList implements ArrayAccess, ...
{
private $list;

...
$list = new ArrayObject(...);
...
}

Твоя задача решается дженериками, которых в PHP нету. Как безвыходный вариант, можно использовать идею с абстрактным методом (можно сделать не getType(), а supports(object $x)), но тогда придется отказаться от тайп-хинтов.

> То есть, вопрос чисто про подсветку в IDE.

Используй doc-комментарий @var: https://intellij-support.jetbrains.com/hc/en-us/community/posts/207025175-Using-to-phpdoc-to-specify-that-a-variable-represents-an-object-class

>>1297070

Переменным надо давать осмысленные имена. Да, это не очень просто, но никто не обещал, что будет легко.

> [а-яё0-9a-z,.?!:;]+
Ты хотел написать "любой символ, кроме пробела"? Тогда надо использовать \\S

> $hui = preg_replace($regexp,"$1$3$5",$hui);
> $hui = preg_replace($regexp,"$1$3$5",$hui);
Почему повторяется 2 раза? Нужен как минимум комментарий.

> $l++;
> if (($letter==".")|($letter=="?")|($letter=="!")) {
> $letters[$l]=mb_strtoupper($letters[$l]);
Здесь есть риск, что элемента $l + 1 может не существовать. Лучше сделать переменную "предыдущий символ", и проверять ее.

А еще лучше - использовать preg_replace_callback.

Расстановку пробелов - нельзя ли было сделать там же, где и удаление пробелов?
Ответы: >>1297532 >>1297540 >>1298000
Аноним 2018/11/19 22:19:47  №1297952 7
Анончики, требуется помощь с задачей ОПа.
>Дан текст, который по идее должен быть номером телефона в виде 8-(911)-506 56 56 (т.е. человек может ввести не только цифры, но и скобки, минусы, может что-то еще). Но в реальности, пользователь может вместо номера написать что угодно. Напиши скрипт для проверки правильности введенного номера («8(911)-506 56 56» — правильный номер, «8-911-50-656-56» — правильный, «89115065656» — правильный, «02» — неправильный, «89115065656 позвать Люду» — неправильный).

ссылка на саму базу телефонов - https://regex101.com/r/qF7vT8/3
Что я накрутил - ([\s\-()]\+7|8)([\s\-()][0-9]){10}$. Не ищет номер с пробелом между + и 7. Очевидным решение будет написать \s* между ними и тогда всё заработает, но сомневаюсь, что это правильное решение.
Буду очень благодарен.
Ответы: >>1297979 >>1297995 >>1308856
Аноним 2018/11/20 00:00:59  №1297979 8
>>1297952
^([\s\-()](\+[\s\-()]7|8))([\s\-()]*[0-9]){10}$
Я видимо изобрёл велосипед, но это работает, но такое ощущение, что можно проще.
Ответы: >>1297995
Аноним 2018/11/20 02:23:44  №1297995 9
>>1297979
>>1297952
Не рекомендую особо заострять внимание на регулярках. У опа они конечно хорошие, но в итоге у вас всё сведётся к тому, что вы её нагуглите и поставите в проект.
Ответы: >>1297996
Аноним 2018/11/20 02:33:47  №1297996 10
>>1297995
Просто интересно. ОП сказал:
>Ты можешь поместить выражение в круглые скобки и задать число повторов: (....){x}

Я так и не допер как. Либо у всех плохо с регуляркой и я вздохну спокойно, либо я безнадёжен.
Ответы: >>1298008
Аноним 2018/11/20 03:04:27  №1298000 11
>>1297487
https://repl.it/@underbottom/povtorenie1 - (исправление пробелов и заглавные буквы) было тяжело, но я разобрался, как работает preg_replace_callback. Видимо на первых порах тяжело вычленять и усваивать инфу из мануала(либо я тупой). Я очень перемудрил с регуляркой и поэтому приходилось 2 раза прогонять, что бы успловия подошли. Сейчас вроде лаконично. Подтянул знания по регулярке и теперь понимаю более-менее, что к чему.
https://repl.it/@underbottom/repeat4 - поправил недочёты.
https://repl.it/@underbottom/repeat3 - Исправил. Я перемудрил.
https://repl.it/@underbottom/value-credit - долго думал, как реализовать вычисления наименьшей цены. Оказалось min сравнивая массивы берёт только валью нулевой строки.(пытался ставить миллион дней результат не поменялся).
https://repl.it/@underbottom/ExcitingUnimportantExperiments - переделал регулярку, уверен, что нужно не так. Но вроде работает.
https://repl.it/@underbottom/repeat1 - переделал регулярку и способ решения.
https://repl.it/@underbottom/exam-after-chapter - опять перемудрил. Исправил.

https://repl.it/@underbottom/yodashuffler




Ответы: >>1308852
Аноним 2018/11/20 05:00:36  №1298008 12
>>1297996

Ок, вопросы:

- ты знаешь, что такое квантификаторы и можешь вспомнить пару примеров?
- ты знаешь, что значат фигурные скобки в регулярке?
- ты знаешь, что значат круглые скобки?

Если нет, поищи ответы, например, тут в мануале: http://php.net/manual/ru/reference.pcre.pattern.syntax.php

Если что-то непонятно, задавай уточняющие вопросы.

Теперь возьмем такую задачу: найдите в тексте последовательность 1 или более чисел, разделенную запятыми. Пример текста: "в 1923, 1934, 1935 годах". Программа должна найти "1923, 1934, 1935".

Как ее решить регуляркой? Попробуем пойти "снизу вверх", от простого к сложному.

Напишем выражение для того, чтобы найти любое число. Число - это 1 или более любых цифр. Напиши это выражение, если не догадался, то ответ: "Любая цифра" в регулярке записывается как \d или [0-9]. "1 или более" повторение задается добавлением после нее квантификатора "плюс". Получается, ...

Теперь, имея выражение для поиска одного числа, напишем выражение для поиска нескольких чисел. Его можно записать так:

число (пробелы , пробелы число) *

Здесь использованы круглые скобки, чтобы квантификатор звездочка применялся к выражению в скобках, а не к одному символу перед ним.

То есть мы ищем число, за которым может идти 0 или более последовательностей из ( пробелов, запятой и еще одного числа).

"Число" - это выражение, которое мы составили выше. "пробелы" - 0 или более пробелов - это \s*. Собрав все вместе, получим ответ.

Попробуй решить эту задачку.
Ответы: >>1298054
Аноним 2018/11/20 07:30:31  №1298054 13
>>1298008
1) Напишу, как я понимаю это. Квантификаторы - условия задаваемые выражению внутри скобок. Например: ^[0-9] - строка начинается с цифры, [\d]$ - строка заканчивается на цифру, [0-9]? - может встретиться цифра.
2) Фигурные скобки. Внутри них задаётся число повторений от n до m. Например, {3,5} - от 3 до 5 или {0,} - от 0 до бесконечности.
3) Круглые скобки - объединяют набор символов и квантификаторов в один элемент(тупая формулировка наверное). Например: (\S+[.?!]) - найдёт последнее слово в предложении с знаком препинания. Так же ими можно манипулировать с текстом. допустим:
preg_replace("/(\S+[.?!])\s([\S])/", "$1$2",$text); - уберёт пробел между концом предложения и началом следующего.

задачка. Число находим вот так [\d]+. Найти число с запятой [\d]+(\,\s)
.
Ответы: >>1298057 >>1308852
Аноним 2018/12/10 00:45:08  №1308852 14
>>1298054

> Квантификаторы - условия задаваемые выражению внутри скобок.
нет, квантификаторы - это символы, которые задают число повторов идущего перед ними символа или выражения. Например: ?, +, *, {...}

> 2) Фигурные скобки. Внутри них задаётся число повторений от n до m.
Верно.

> 3) Круглые скобки - объединяют набор символов и квантификаторов в один элемент(тупая формулировка наверное).
Верно.

> задачка. Число находим вот так [\d]+. Найти число с запятой [\d]+(\,\s).
> >[\d]+(\,\s)*

Нет, неверно. У тебя написано:

искать число, за ним выражение ( запятая, пробел ), которое повторяется любой число раз.

То есть твое выражение это:

число (запятая пробел)*

Но нам надо искать число, за которым может идти сколько угодно других чисел через запятую:

число (пробелы запятая пробелы число)*

Попробуй записать это на языке регулярок.


>>1298000

> https://repl.it/@underbottom/povtorenie1 - (исправление пробелов и заглавные буквы)

Здесь можно было обойтись одним preg_replace:

> $regexp = "/(\S+)(\s)([,.!?:;]+)(\s)/ui";
> $text = preg_replace($regexp,"$1$3",$text);
> $regexp = "/([,.?!:;]+)([a-zа-яё0-9]+)/ui";
> $text = preg_replace($regexp,"$1 $2",$text);

В первом выражении [,.!?:;]+ квантификатор плюс "жадный" ( http://php.net/manual/ru/regexp.reference.repetition.php ) и захватит максимально возможное число символов в тексте. То есть, если там будет многоточие, то эта конструкция захватит все точки в нем. И потому можно одним preg_replace и убрать лишние пробелы, и добавить один пробел после знака.

> function makeLetterUp ($match) {
Эта функция сделана не очень логично, что она принимает массив, а не строку с буквой. Для использования с preg_replace_callback выгоднее было бы использовать анонимную функцию:

$upcaseLetter = function ($match) { ... };
...preg_replace_callback(..., $upcaseLetter);

Или вообще, убрав переменную:

...preg_replace_callback(..., function ($match) {
...
});

Почитать: http://php.net/manual/ru/functions.anonymous.php

Также, у тебя отдельно меняется регистр первой буквы в тексте, а отдельно - первых букв в предложениях. Можно было бы объединить это в одно действие.

А так, решено верно.

> https://repl.it/@underbottom/repeat4 - поправил недочёты.

> [^\\s]
Можно просто \\S

> $changedText=str_replace("здел","сдел",$changedText);
Слово "раздел" будет заменено на "расдел".

> [^,а-я0-9a-z]
ё не входит в диапазон а-я и его надо указывать отдельно.

> (а|но\s)

Здесь \s относится только к "но", но не к "а". Также, здесь проще использовать \b, чтобы указать, что там должна быть граница слова.

В общем, пока тут есть проблемы.

> https://repl.it/@underbottom/repeat3 - Исправил. Я перемудрил.

Ок, верно.

> https://repl.it/@underbottom/value-credit - долго думал, как реализовать вычисления наименьшей цены. Оказалось min сравнивая массивы берёт только валью нулевой строки.(пытался ставить миллион дней результат не поменялся).

Если 3 банка, то можно просто поставить 2 if. Также, можно сделать цикл по массиву, сравнивая каждый элемент с ранее найденным мин. значением. Также, можно отсортировать массив и взять первый элемент.

> $result [0] = 0;
> $result [1] = $i;

Это не очень понятный код, так как непонятно, что хранится в элементах массива. Что значит $result[0]? Лучше использовать переменные, а в конце функции написать:

return [$price, $bankName, ..];

Так виден формат результат и что в нем. Дополнительно можно описать это в комментарии перед функцией.

Я, кстати, не знал про такое использование min() и не встречал такое нигде. Но почему бы и нет.

Решено верно, но код мог бы быть понятнее.

> https://repl.it/@underbottom/ExcitingUnimportantExperiments - переделал регулярку, уверен, что нужно не так. Но вроде работает.

Ошибка 404 при попытке открыть ссылку.

> https://repl.it/@underbottom/repeat1 - переделал регулярку и способ решения.

> $phone = preg_replace ("/\+7/","8",$phone);
тут стоило добавить привязку к началу строки, а то +7 может быть и в середине. В остальном верно.


> https://repl.it/@underbottom/exam-after-chapter - опять перемудрил. Исправил.

Твоя программа считает одиночную латинскую букву вроде x или z ошибкой: https://repl.it/repls/ForsakenUnitedFreesoftware

Также, она должна бы находить русские буквы в латинских словах.

> https://repl.it/@underbottom/yodashuffler

> $word = [];
> $phrases = [];
Эти глобальные переменные никак не используются.

> function makeYodaStyleText($text) {
> $phrases = [];
> $i = 0;
Это можно было не писать.

> ([.|!|?|;])
В квадратных скобках верт. черта не является спецсимволом и не имеет специального значения. Надо писать либо [.!?;] либо \.|!|\?|; . И круглые скобки не нужны тут. Что они делают тут?

> foreach ($word as $idinahooi) {
$words as $word. Как читать твою программу?

Раз ты разбил текст на предложения, можно было сразу же сделать первую букву в предложении заглавной и избавиться от функции fixText.

В общем, сильно переусложнено.
Ответы: >>1308853
Аноним 2018/12/10 00:47:03  №1308853 15