Задать вопрос
Ответы пользователя по тегу PHP
  • Почему переменная себя так странно ведет?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Это не странно.
    Просто по факту в переменной не "true" и не "false".
    (это ответ на вопрос)

    Попробуйте: echo($hasInstalled);
    Также попробуйте: echo(strlen($hasInstalled));
    (это отладка вашего кода)
    Ответ написан
    5 комментариев
  • Какое создать регулярное выражение?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Главное, чтобы было четыре секции между двоеточиями.

    Если это главное (и единственное) требование, то сами секции задаются как раз этим двоеточием. Поэтому банальное (но пока что ошибочное) рег. выражение:
    .*:.*:.*:.*
    Двоеточие в этом выражении соответствует двоеточию в исходной строке. Поэтому строка a:b:c будет не валидной - слишком мало секций. Выражение .* означает любое количество любых символов. Ошибка здесь в том, что любым символом также может быть двоеточие, поэтому это регулярное выражение разрешает более, чем 4 секции. Чтобы исправить это, нужно запретить символ двоеточия в последовательности любых символов. Выражение [^:] означает любой символ, кроме двоеточия:
    [^:]*:[^:]*:[^:]*:[^:]*

    Остался последний штрих. Пока что это рег. выражение всё ещё разрешает более одной секции, потому что поиск можно начинать с середины строки и заканчивать, не доходя до конца. Поэтому если подсунуть строку a:b:c:d:e:f выражение убедится, что подстрока a:b:c:d соответствует рег. выражению, а значит валидна. Чтобы исправить это, нужно указать, что проверку нужно начинать с самого начала строки и дойти до самого конца строки. То есть рассматривать строку целиком, а не по частям. Это делается с помощью указателей позиций. Символ ^ (в начале) означает начало строки, а символ $ (в конце) означает конец строки:
    ^[^:]*:[^:]*:[^:]*:[^:]*$

    Собственно, это и есть правильный ответ в общем виде на вопрос с главным требованием. Секции ровно четыре и они разделены двоеточием. В каждой секции двоеточие запрещено. Выражение [^:]* означает любое количество любых символов, кроме двоеточия, что нам и нужно.

    Однако данное выражение можно немного улучшить, в зависимости от дополнительных требований. Например, нас может не устроить, что для каждой секции считается валидным любое количество символов, даже нулевое. То есть строка a:b::c тоже будет валидной. Для этого нужно сменить квантификатор * на какой-либо другой. Например, можно сменить на +, который означает любое количество вхождений (символа) больше нуля, то есть 1 и более:
    ^[^:]+:[^:]+:[^:]+:[^:]+$

    Далее, может быть желательно выделить группы, чтобы рег. выражение не только проверяло исходную строку на соответствие шаблону ip:port:user:pass, но и извлекало эти самые переменные. Группы задаются просто скобками. Очевидно, что разделители и указатели позиций в группы не входят:
    ^([^:]+):([^:]+):([^:]+):([^:]+)$

    Далее можно вспомнить, что параметр port может содержать лишь арабские цифры. В регулярных выражениях \d (или [0-9]) означает любую цифру. Так что легко вносим улучшение:
    ^([^:]+):(\d+):([^:]+):([^:]+)$
    Хотя постойте-ка. Это ещё не всё с параметром port. Ведь абсолютное любое число, состоящее из цифр, нас не устроит. Как минимум, порт не может быть больше 65535, поэтому любое число выше считается ошибкой. В принципе, на данном этапе можно не заморачиваться и просто проигнорировать это требование, а реально проверить его позже кодом типа такого: $post < 65356, но в качестве примера можно всё же ограничить количество цифр от 2 до 5:
    ^([^:]+):(\d{2,5}):([^:]+):([^:]+)$
    Квантификатор {2,5} означает, что количество вхождений (цифр) должно быть не менее 2 и не более 5, иначе секция будет считаться не валидной, а значит и вся строка тоже.

    Далее, можем также сделать более строгое условие для параметра ip. Для простоты будем считать, что разрешён только IPv4, а IPv6 нельзя использовать. Тогда условием будет 4 цифры, разделённые точкой. Каждая цифра от 1 до 3 символов:
    \d{1,3}.\d{1,3}.\d{1,3}.\d{1,3}
    Ой, ошибочка вышла! Дело в том, что символ . является квантификатором. И чтобы рег. выражению сказать, что нам нужен сам символ точки, нужно его экранировать: \.
    В результате полностью рег. выражение получается таким:
    ^(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}):(\d{2,5}):([^:]+):([^:]+)$


    Да, получился монстр. Но нет предела совершенству.

    Правда, на этом этапе улучшать проверки уже не целесообразно. Далее уже кодом PHP можно проверить более строги условия. Например, сейчас в качестве ip будет валидной строка 300.400.500.600. Ведь всё сходится - 4 числа, разделённые точкой, в каждом от 1 до 3 цифр. Поэтому нужно либо более монструозное выражение лепить, либо кодом проверять, либо отдать на откуп сетевым ошибкам подключения - зависит от конкретного приложения и конкретной задачи.

    Рег. выражения не заточены на сравнение чисел, например. Чтобы проверить, что число находится в диапазоне от 0 до 255, придётся лепить что-то такое:
    (?:\d\d?|[0-1]\d\d|2[0-4]\d|25[0-5])
    То есть это вообще поразрядная проверка. Глупо. Проще это делать кодом, если это действительно нужно.

    На данном же этапе имеет смысл проверять лишь то, подо что заточены регулярные выражения. Например, можно ограничить класс символов, которые входят в user и в pass. Например, в пароле можно разрешить только латинские символы и цифры, а также ограничит длину: пароль не может быть меньше 6 и не может быть больше 32 символов:
    [a-z0-9]{6,32}
    (просто пример)

    И так далее в таком же духе. Как было сказано выше, прочие тонкости уже зависят от конкретной задачи.
    Ответ написан
    1 комментарий
  • Как изменить регистр определенных целых слов?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    $noUp[$i]
    Ответ написан
    Комментировать
  • Есть и разница между разделителями | и +?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    1 + 2 == 3
    1 | 2 == 3

    но
    1 + 3 == 4
    1 | 3 == 3

    ибо 1 | 3 - это поразрядное ИЛИ, то есть берём в двоичной 01 и 11, и в результате ставим те разряды в 1, для которых у хотя бы одного аргумента на том же месте стоит 1, и получается снова 11 (т.е. 3 в десятичной).
    ваш пример
    Можете проверить значение константы как-то так: echo(XHPROF_FLAGS_CPU);
    Обычно флаги задаются степенями двойки: 1, 2, 4, 8, 16 и т.д., поэтому их можно складывать через + и обычно это не является ошибкой, но по-хорошему правильнее использовать | для флагов.
    Ответ написан
    2 комментария
  • Как проверить заголовок?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Проверить так:
    /[g-z]|[a-f]{3,}/i
    Ответ написан
    1 комментарий
  • Как равномерно распределить массивы между пользователями?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Как-то так:
    spoiler
    //v1.0
    function arr_num($user_id) {
      static $N = 10;
      return $user_id % $N;
    }

    Когда количество списков снова возрастёт, чтобы назначенные не менялись:
    spoiler
    (при условии, что user_id задан через auto_increment)
    //v2.0
    function arr_num($user_id) {
      static $N = 100;
      if ($user_id < 556780960) { //old algorithm v1.0
        return $user_id % 10;
      }
      return $user_id % $N;
    }
    Хотя будет не совсем равномерно в целом, но дальше уже начинается больше математика, чем программирование.
    Ответ написан
    Комментировать
  • Каким регулярным выражением можно найти знак ")"?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Нужно экранировать его:
    \)
    spoiler
    $re = '/\)/';
    $str = 'Hi (all)!';
    
    preg_match_all($re, $str, $matches, PREG_SET_ORDER, 0);
    
    // Print the entire match result
    var_dump($matches);

    https://regex101.com/r/tRw8Ug/2
    Ответ написан
    Комментировать
  • Как задать условие?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Немного сумбурно и странно звучит вопрос.

    Насколько я понимаю, вы выводите или не выводите блок div по своему усмотрению, а после него в обязательном порядке выводится блок с изображением, в который вы не можете вмешиваться.

    В таком случае желание не показывать блок в коде противоречит условию задачи. Ведь выводить или не выводить мы узнаём позже, причём на стороне клиента с помощью js. Так что в коде блок должен присутствовать обязательно.

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

    Делается это, очевидно, путём изначальной невидимости блока div.
    .block {display:none}

    Далее скриптом отслеживаем появление изображения, и меняем свойство невидимости у блока.
    Ответ написан
    1 комментарий
  • Регулярка php удалить пробел?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Искать: (^| )3 [дД]($|[ .,!?:;])
    Заменить на: $13д$2

    https://regex101.com/r/6Gv4HC/2
    Ответ написан
    Комментировать
  • Как запретить удаление последнего пользователя?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    LOCK TABLE имя_таблицы WRITE;
    Ответ написан
    Комментировать
  • Как выявить сильное отклонение в массиве?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    В идеале вам нужно как-то посчитать себестоимость. По весу, по материалу товара, по его бренду, стране сборки и т.д. Затем прибавить условные 20%. Это будет "красная" цена (не путать со средней).

    Далее вам нужно определиться, какое отклонение допустимо.
    • Например, оно может быть выражено в процентах от красной цены. Скажем, плюс-минус 40% - ок.
    • Другой пример, когда мы смотрим соседние цены, и если очередной скачок цены превышает 10%, то считаем, что продавец оборзел, а значит и все после него тоже борзые - отсекаем.
    • Любой другой числовой критерий. Это может быть комбинация вышеуказанных способов или ещё более сложная формула.


    В статистике такие неудобные значения называются выбросами. Их принято исключать из выборки, потому что они портят саму статистику своей полной неадекватностью. Но вот критерий этой самой неадекватности определяете вы сами. Для этого важна природа изучаемого явления, а не просто голые числа. Конкретно про ваши числа известно, что это цены. На этом факте и построена логика моего ответа.
    Ответ написан
    4 комментария
  • Как регуляркой вырезать конкретную ссылку?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Вроде всё должно работать, как надо:
    https://regex101.com/r/Beayr4/1

    Но на всякий случай вот вариант с проверкой "z":
    https://regex101.com/r/Beayr4/2
    Ответ написан
  • Как вытянуть данные из строки через регулярные выражения PHP?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    ^(К?[0-9, ()м]+) (?:Ламінат|Акція Ламінат) ([A-Za-z0-9\/( .]*[\d)]) (.+?)(?: \(\d|\s*$)

    https://regex101.com/r/1PgPNP/5
    Ответ написан
    3 комментария
  • Блокировка загрузки скрипта на сайте (как)?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Если для использования стороннего скрипта B вы согласились на рекламу V, то вы сейчас, получается, хотите обойти соглашение и нарушить условия сделки. Самый правильный путь - договориться иначе (перезаключить другую сделку). Если не удаётся, то уйти к конкурентам и договориться с ними на более выгодных условиях. Если и это не удаётся, то найти альтернативное решение. Ну и железобетонный последний вариант - реализовать подобный функционал самому, что бы это ни было (алгоритм, база, аудитория, информация) - всё можно сделать, собрать, накопить, привлечь, за свои деньги конечно же.

    Заниматься хакерством - не самый правильный путь. Но здесь уже нет рецептов. Вы сами решаете, как именно обмануть партнёра. Решение будет зависеть от деталей, и от того, как именно устроены N, B ,V. Дырки в них могут оказаться такими, что их можно использовать. А если партнёр заранее побеспокоился о своей безопасности, то обход скрипта V так, чтобы использовать B, может обойтись вам дорого (вы потратите много сил и времени, ну или денег, конечно же).
    Ответ написан
    2 комментария
  • Можно ли не указывать конкретную папку в пути к картинке?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Нельзя.
    Но можно все картинки скопировать в одну папку (например, upload), а затем массовой заменой в файлах изменить пути картинок по шаблону (по регулярному выражению).
    Ответ написан
    Комментировать
  • Как из html-кода вырезать php-вставки, включая сами теги?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Так:
    '#<\?[\s\S]*?\?>#'

    Ещё можно так:
    '#<\?.*?\?>#s'
    Ответ написан
    1 комментарий
  • Как избавиться от запятых с помощью регулярных выражений?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Примерно так:
    $str = 'раз, два, три и 4,567,';
    echo preg_replace('/, ?/', ' ', $str); //раз два три и 4 567

    Но нужно уточнить вопрос, чтобы ответить более точно.
    Ответ написан
    Комментировать
  • Как добавить пробел в регулярное выражение?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    $text = "Саакян Андраник Шаликоевич";
    
    if(preg_match("#^[а-яА-ЯёЁ ]+$#iu",$text)){
        echo 'Все верно';
    }
    else{
        echo 'error';
    }
    Ответ написан
    Комментировать
  • Можно ли определить, что сайт использует несколько языков с помощью PHP?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    С помощью PHP можно всё то же самое, что и руками.
    Например, дёргать ru.example.com или example.com/ru и т.д. Ну и заголовки пробовать, смотреть. Короче, на что фантазии хватит. Но 100% способа нет.

    Самый надежный (но не 100%) способ - написать скрипты по сложности аналогичные поисковым ботам, то есть просканировать весь сайт и проиндексировать его. И по словам определить, какие там языки использованы. Как вы понимаете, это очень сложная задача. Тем не менее, отвечая на вопрос "можно ли с помощью php...", могу сказать, что можно.
    Ответ написан
    Комментировать
  • Как сделать так, чтобы куки отображалась только на странице определенного пользователя из БД?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    $user = R::findOne( 'users', 'user_name = ?', array($data['user_name']) );
    if (isset($data['search'])) {
      if ($user['user_name'] == "Vasya Pupkin") {
        setcookie("executor_user_name", $_SESSION['logged_user']->user_name);
      }
      setcookie("customer_user_name", $user['user_name']);
    }
    Ответ написан