Ответы пользователя по тегу PHP
  • Можно ли как то бороться с одинаковыми по написанию символами латиницы и кириллицы?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Нужно набрать в гугле "поиск кириллицы".
    Ваш Кэп.

    UPD
    Мда, я думал вам нужно просто в тексте увидеть визуально) Не правильно понял вопрос.

    База - это уже слишком, имхо. Ну т.е. если она не меняется, то ладно, а если каждый раз пополняется, то сегодняшняя и вчерашняя функции могут давать разные результаты, и нужно будет заново перепарсивать старые данные. Разве что нужно исправлять опечатки, но это уже более крутая задача, чем в вопросе.

    Думаю, нужен хитрый алгоритм. Превосходящее число символов - верное направление. Но также, имхо, нужно учитывать процент и тип символов и порядок слов.

    Тип символов. Каждому символу ставим в соответствие число, которое означает русскость от 0 до 1. Например, Б = 1, i = 0, T = 0.5, то есть три варианта. Хотя я бы сделал исключение для пары символов Р = 0.4 и Х = 0.3. Вряд ли самолёт назовут Х320 (буква ха, хз как это звучать будет). Но это может вызвать казусы, так что решать вам. Хотя можно два массива придумать для разных случаев, но это уже сложно для понимания.

    1) Считаем средний вес символа в слове. Тут всё очевидно. Но если 0.5, то не спешим округлять, а переходим к п.2

    2) Когда вес 0.5, смотрим на предыдущее слово, если вы уверены, что это часть названия. Например, оно с большой буквы (если вы парсите цельный текст). Если у предыдущего слова вес тоже был 0.5, то тогда уже округляете текущее слово в определенную сторону.

    3) Соответственно, если три и более слова в названии, то тоже их учитываете по цепочке.

    4) Если заранее можно выделить название и быть уверенным, что все слова - его части, то можно посчитать среднюю температуру по больнице. И на её основе делать выводы о каждом слове, у которого вес 0.5.
    То есть название
    Аве Maria T100 считаем так: первое слово вес 0.66, второе слово вес 0.3, проблемы нет, а вот третье слово вес 0.5 - проблемка. Считаем среднюю по всему названию, выходит 0.44, то есть вывод, что Т - английская.

    Хотя если присмотреться, то здесь вообще хорошо бы заменить Аве на Ave, но, как писал выше, это уже другая задача. Но напишу немного про неё. Я бы на вашем месте просто делал бы русский вариант и соответствующую ему латиницу и заносил бы в базу и считал. В случае, если оба названия после приведение встречаются по 1 разу, то есть где-то привели как Аве Мария, а где-то Ave Maria, то парсер вам сигналит ошибкой, а вы уже смотрите своими глазами на название и заносите его в исключение, чтобы везде было одинаково. Также есть опечатки типа AirBus - аналогично в базу, только преобразования по регистру, и вариантов больше - все возможные комбинации, из которых для ошибки достаточно накопить два разных варианта.
    Ответ написан
    7 комментариев
  • Как убить ботов на сайте?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Боты убиваются очень просто.

    Нужен любой простой тест, который могут пройти только люди. Это не обязательно капча или что-то сложное. Можно использовать простой приём, который легко обойти, но который (как раз по этой причине) мало где используется.

    Пример: ставим на ссылку ложный url. Если пользователь наводит мышку на ссылку, и вообще шевелит мышкой (а боты этого не делают), то меняем ссылку на нормальную, так что пользователь перейдёт, куда нужно. А куда перейдёт бот - вам решать. Но если тупо заблокировать, то хозяин ботов быстро сообразит, что надо улучшить бота. Так что лучше показывать им что-нибудь. Можете цену в 2 раза выше показать, например.
    Ответ написан
    4 комментария
  • Как мне вставить много html кода в ветвление?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    <?php
    $title = 'Заголовок';
    if(true){
    ?>
    <html>
    <head>
    <title>php</title>
    <body>
    <h1><?=$title?></h1>
    </body>
    </head>
    </html>
    <?php echo 'строка'; } ?>

    То есть все ветвления (типа тех, что считают $title) пишите выше в других местах, а дальше просто единый html с уже готовыми вставками-переменными.
    Ответ написан
    Комментировать
  • Как логично и структурно именовать переменные?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    В английском языке существительные в начале превращаются в прилагательные, а в конце - существительное, к которому они относятся.
    Сравните: "stone wall" (каменная стена) и "wall stone" (камень из стены).

    То есть первым делом нужно определиться с главным существительным, то есть ЧТО имеется в виду. Если это имя, то название переменной должно оканчиваться на _name (или Name в зависимости от стиля).

    Далее, если не придираться к правилам, то последовательность прилагательных лучше делать так: чем важнее, тем ближе к существительному.
    Шаг первый: product_name
    Шаг второй: homepage_product_name (при этом вам должно быть очевидно, что не home_page)

    Далее, ничего лишнего быть не должно, и должно максимально точно отражать суть. Например, настройка, говорящая о том, что уведомления можно посылать только если приложение неактивно.
    Не правильно: notify_if_inactive (вообще не понятно, не логично)
    Правильно: is_notify_if_inactive_only
    Приставка is_ в данном случае является соглашением в нашей команде, указывающем, что это булева переменная, можно также юзать b_ например для той же цели. Или, скажем, если это константа или меняется очень редко, можно записать капсом или добавить приставку c_

    Вообще дальше уже начинаются тонкости и вкусовщина. Основные принципы изложены выше - это четкий порядок построения и соответствие сути.
    Ответ написан
    Комментировать
  • Как сделать чтобы посетитель мог отправить заявку с сайта только один раз?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Если пользователь анонимный, то куки. Можно ещё всякие отпечатки браузера использовать.

    Если авторизованный, то нужно сделать отдельное поле в базе данных, где и помечать, что пользователь уже отправил форму, а точнее дату отправки, чтобы сравнивать её с текущей каждый раз.
    Ответ написан
    Комментировать
  • Почему пустой $_REQUEST после отправки формы?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    А зачем вам значение кнопки? Какая в этом логика?
    Это же не поле ввода какое-нибудь, не чекбокс и т.д.?
    У вас же всего одна кнопка submit.

    А что есть? Другие поля есть? Попробуйте:
    var_dump($_REQUEST);
    Ответ написан
    Комментировать
  • Оптимизировать код или как выделить всю вычислительную мощность пк на его выполнение?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Первое, что бросается в глаза - это многократное копирование массива. Представьте, что при сортировке мы бы после каждых двух-трех перестановок делали бы полный дубликат массива. Это же ужас! И это слабое место, постоянное перевыделение памяти больших размеров.

    Второе, что тоже важно - это сложность O(N*N). В вашем случае это критично, потому что много элементов в исходном массиве.

    Предлагаю немного изменить алгоритм. Делаем одно прохождение, но немного увеличиваем потребление памяти, в которой храним интервалы. Таким образом, мы избавляемся от постоянного копирования массива, а также уменьшаем сложность примерно до O(N).

    И маленькая оптимизационная хитрость - поиск интервала происходит по индексу, то есть O(1). Нужно немного поразмыслить, чтобы до этого догадаться, но в целом всё просто.
    Код
    <?php
    $arr = [100,125,75,175,25,300,275,325,375];
    $step = 50;
    
    $b = []; //-1 - deny, 0 - not set, 1 - has interval
    $int = []; //intervals if necessary 
    $step2 = intdiv($step,2);
    $arr = array_values(array_filter($arr, function($v) use ($step2,&$b,&$int) {
        $i = intdiv($v,$step2);
        $mod = $v % $step2;
        $res = true;
        if (isset($b[$i])) {
            if ($b[$i] === -1) $res = false;
            elseif ($mod < $int[$i][0] or $mod > $int[$i][1]) $res = false;
        }
        $b[$i] = -1;
        $b[$i+1] = -1;
        $b[$i-1] = -1;
        if (!isset($b[$i+2])) {
            $b[$i+2] = 1;
            $int[$i+2] = [$mod,$step2];
        } elseif ($b[$i+2] === 1) {
            if ($int[$i+2][0] < $mod) {
                $int[$i+2][0] = $mod;
                if ($int[$i+2][0] >= $int[$i+2][1]) $b[$i+2] = -1;
            }
        }
        if (!isset($b[$i-2])) {
            $b[$i-2] = 1;
            $int[$i-2] = [0,$mod];
        } elseif ($b[$i-2] === 1) {
            if ($int[$i-2][1] > $mod) {
                $int[$i-2][1] = $mod;
                if ($int[$i-2][0] >= $int[$i-2][1]) $b[$i-2] = -1;
            }
        }
        return $res;
    }));
    
    var_dump($arr); // [100, 175, 25, 300, 375]
    ?>

    Переписав алгоритм на С++, получите дополнительно 50-кратное увеличение скорости.
    Ответ написан
    3 комментария
  • Как правильно составить регулярное выражение?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    class="project_line line project(\d+)" data-type="(?:newpost|[^"]+_adv)"

    Проверить
    Ответ написан
    Комментировать
  • Как подсчитать количество тегов p в блоке div?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    (document.getElementsByClassName('wrap')[0].innerHTML.match(/<p[\s>]/gi)||[]).length;
    Ответ написан
  • Как запретить использование двух или более одинаковых символов подрят?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    В общем случае проверить наличие одинаковых подряд символов можно так:
    (.)\1

    А какой язык программирования?
    Ответ написан
  • Почему отправка сообщений через ajax работает не во всех браузерах?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Пусть клиент перечислит браузеры, для которых хочет совместимости.
    Дальше, думаю, не проблема отладить скрипт для каждого в отдельности.
    Ни вы, ни мы не должны гадать, что там за "не все" браузеры у клиента, может он вообще имеет в виду Netscape Navigator.
    Ответ написан
  • Как последовательно передать данные со страниц методом POST?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    <?php print_r($_POST); ?>
    Ответ написан
    Комментировать
  • Как генерировать номер заявки с сайта?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Создавайте номер на сервере при открытии страницы с формой заявки.
    Таким образом, форма будет знать номер, он будет уникальный, и ему будет соответствовать запись в базе данных.
    Ответ написан
    Комментировать
  • Как программно вставить блок после тегов в тексте?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Как вам такая идея.
    Все три тега совмещаем в одном цикле.
    На каждой итерации ищем следующий тег с помощью strpos. То есть выполняем три поиска (по одному для каждого тега), затем берем ближайшую позицию - и с ней уже работаем. Следующей поиск от этой позиции.
    Ответ написан
    1 комментарий
  • Безопасность в интернет магазине скриптов?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Не отдавайте прямую ссылку на файл. Давайте ссылку на скрипт, который отдаёт файл.
    Пример: download.php?id=2345

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

    И такой магазин уже есть:
    https://itch.io
    Ответ написан
  • Timeout, как бороть зло?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Если сервер ваш, то настраивайте php.ini
    Если чужой, разбейте задачу на много маленьких.
    Ответ написан
    Комментировать
  • Как правильно изменять json массивы, чтобы не добавлялась индексация?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    В конце сделайте
    sort($result)
    Ответ написан
    Комментировать
  • Как сохранить iso в отдельной переменной и изменить ее значение?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    $iso = $info->payment[0]->currency[1]->iso;
    if (strtolower($iso) == 'rub')
      $iso = 'rur';
    Ответ написан
    1 комментарий
  • Массовая оптимизация изображений на сервере, как?

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

    Также для PHP есть библиотека GD, но не уверен, что она умеет оптимизировать. Уровень компрессии можно указать при сохранении максимальный, например. Но всякие хитрые способы сжимать до упора - вряд ли есть.
    Ответ написан
    Комментировать