• Как удалить все двоеточия и точки с запятой но оставить первые два двоеточия?

    @Azperin
    Дилетант
    var str = 'Камера:Разрешение фото и видео:фото: 3840х2160P; видео: 1920х1080P';
    var arr = str.replaceAll(';', '').split(':');
    var result = `${ arr.splice(0, 1)[0]} : ${ arr.join('') }`;

    С регуляркой не знаю, но предложу такой вариант на JS
    Ответ написан
    1 комментарий
  • Как удалить все двоеточия и точки с запятой но оставить первые два двоеточия?

    sergey-kuznetsov
    @sergey-kuznetsov
    Автоматизатор
    Удалить символ только если ранее уже было два подобных
    s = 'Камера:Разрешение фото и видео:фото: 3840х2160P; видео: 1920х1080P'
    result = s.replace(/(?<=(?:.+?[:;]){2})(.+?)[:;]/g, '$1')
    // Получим result:
        'Камера:Разрешение фото и видео:фото 3840х2160P видео 1920х1080P'

    https://regex101.com/r/gWZ7Ap/1
    Ответ написан
    3 комментария
  • Не до конца правильно работает добавление текста на страницу, как исправить?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Если вам надо заменить содержимое нескольких элементов с одинаковым классом, то и выбирать надо не один элемент, а несколько. Соответственно и замену надо производить циклом.
    const today = String((new Date()).getDate()).padStart(2, '0');
    
    const dayStartElements = document.querySelectorAll(".js-text");
    dayStartElements.forEach((el) => { el.innerText = `${dd}` });
    Ответ написан
    1 комментарий
  • Как сделать формат данных в цикле?

    0xD34F
    @0xD34F Куратор тега JavaScript
    const clone = (data, replacements) =>
      data instanceof Object
        ? data instanceof Array
          ? data.map(n => clone(replacements?.hasOwnProperty(n) ? replacements[n] : n, replacements))
          : Object.fromEntries(Object.entries(data).map(([ k, v ]) => [
              k,
              clone(replacements?.hasOwnProperty(k) ? replacements[k] : v, replacements)
            ]))
        : data;
    
    
    const products = arr.map(n => clone(obj.product[0], n));
    Ответ написан
    4 комментария
  • Почему не записываются буквы при регистрации?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Уж сколько раз твердили миру...
    На конференции к звездам надо приходить запросы надо выполнять подготовленными.
    А не вот это вот всё.
    Иначе проблемы с буквами покажутся детской щекоткой.
    Какой вообще смысл делать регистрацию, если любой школьник сможет войти под чужой учёткой вообще без пароля, через простейшую SQL инъекцию?

    Надо забыть про mysqli_query и освоить функции prepare(), bind_param(), и execute(). Причём не только для insert, но и для select тоже. Потому что через него можно будет повытаскивать все пароли. Поскольку они ещё и не захэшированы.
    Ответ написан
    Комментировать
  • Бывали ли случаи, что deprecated-код вновь объявляли актуальным?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Deprecated не так страшен. Для java экосистемы такой стикер может висеть по много лет. За это время вы успеете поменять проект.

    Более хуже ситуация когда разработчик завязался на недокументированное поведение а его (поведение) в новых версиях исправили. Шок трудно описать :)
    Ответ написан
    Комментировать
  • Бывали ли случаи, что deprecated-код вновь объявляли актуальным?

    Griboks
    @Griboks
    Никогда такого не встречал. Но встречал чуть чаще чем всегда что-то вроде "foo is deprecatd and will be removed in version 123, use bar istead".

    Но чаще всего я встречаю ошибки вида "мы втихую поменяли логику foo, поэтому все программы с обновлением нашей библиотеки просто не работают - это ваши проблемы, следите за нашим новостным сайтом сами".
    Ответ написан
    1 комментарий
  • Бывали ли случаи, что deprecated-код вновь объявляли актуальным?

    vabka
    @vabka
    Токсичный шарпист
    Думаю, такое вполне могло когда-то случиться, но ситуация в целом странная:
    1. Deprecated объявляют уже после появления альтернативы
    2. Deprecated обычно объявляют, что удалят в такой-то версии

    Получается, если раздепрекейтить какой-то метод, то у тебя в будет два способа делать одно и тоже, и придётся официально поддерживать оба варианта. Зачем добровольно брать себе двойную работу?
    Ответ написан
    2 комментария
  • Полезно ли долго (и вообще) «велосипедить» в программировании?

    Moskus
    @Moskus
    Когда советуют, убедитесь, что у вас и у аудитории этого совета одна цель. Потому что "как можно скорее начать пользоваться фреймворками" - это если задача - как можно скорее начать шлёпать продукт и деньги получать. А если задача - научиться программировать, фреймворки тут не при чем.
    Ответ написан
    14 комментариев
  • Полезно ли долго (и вообще) «велосипедить» в программировании?

    я замечаю что гораздо лучше всё усваиваю когда делаю всё с нуля

    Поверьте - так у всех.

    Но вы обратили внимание, что в школе вам рассказывали про опыты Галилея, а не дали два шарика и не сказали - разберитесь какой из них падает быстрее?

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

    Объем знаний слишком велик чтобы полсностью сгенерировать его самостоятельно. Best practice много и ко всем сразу сам не придешь. Чему-то учиться придется.
    Поэтому наилучшая схема чуть-чуть повелосипедить. Изучить пару фреймворков. Попробовать опять повелосипедить. Изучить еще один, а там, может быть, присоединиться к разработке какого-то..
    Ответ написан
    Комментировать
  • Живы ли вэб-компоненты?

    Suntechnic
    @Suntechnic Автор вопроса
    Мой собственный ответ после изучения темы и чтения иностранных коллег будет таким:

    Технология была многообещающей и интересной на старте. Для ее поддержки гугл даже придумал отдельную спецификацию HTML Imports: https://w3c.github.io/webcomponents/spec/imports/i... (можете не ходить, там 404), что позволяло подключать однофайловые компоненты прямо в документ так:
    <link rel="import" href="my-component.html">
    Классно же да?

    Но технология не приобрела популярности, возможно так как была слишком простой и понятной, а именно в это время на пик славы вышел npm, gulp и вот это всё. В моду входила непонятная магия, утрата контроля над кодом и всякие оптимизаторы позволявшие сделать для одного слайдера на главной страницы бандл в полтора, а иногда 2-3 Мб. кода, и всё это без всяких там jQuеry.
    Ребята одумались и убрали спецификацию HTML Imports, предлагая разбивать компоненты на 3 отдельных файла - js, css и html с шаблоном. Причём js надо было подключать на странице, css тоже, а html должен был загружать по задумке создателей уже в само js. Такой подход позволял резко усложнить работу с web-components и сделать код снова неуправляемым, но было поздно - технология уже уступила позиции конкурентам.
    Конечно это был сарказм, если кто-то не понял.

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

    Короче технология по задумке хорошая, но на практике не применимая, поэтому широкого распространения и не получает.
    Ответ написан
    2 комментария
  • Почему при обращении по ключу объекта, который сам (ключ) является объектом, всегда возвращается значение последнего ключа?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Ключи объектов - это строки, если использовать нестроковое значение в качестве ключа, оно будет преобразовано в строку, дефолтное строковое представление объекта - это "[object Object]". Всё.

    Хотите, чтобы объект реально был ключом - записывайте его в Map вместо простого объекта. Или научите свои объекты представлять себя в виде строки, переопределив у них метод toString (конечно, поступать так имеет смысл только в том случае, если вы можете гарантировать, что строковые представления будут уникальны).
    Ответ написан
    5 комментариев
  • Как исправить проблему с созданием регистрации пользователей?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Это всё просто ужасно. Начиная прямо с первой строчки, class Register extends Database
    Делать отдельный класс для регистрации глупо. Если уж делать класс, то для манипуляции юзером в целом, а не одной только регистрации. Плюс, регистрация пользователя - это не база данных. И не должна наследовать классу Database.
    По сути, вы хотите натянуть ООП на обычное процедурное программирование. Не надо этого делать, получится самолёт из соломы. Сделайте простую функцию.

    Но это ещё цветочки. Остальных проблем тут выше крыши:
    1. Никогда не используйте сокращённый синтаксис INSERT. Всегда надо явно перечислять поля. Это, скорее всего, и является причиной ошибки. Но даже если нет, то проблемы всё равно вылезут в будущем
    2. Собственно сообщение об ошибке нам и надо получить от базы данных, чтобы понять в чем проблема. для этого к коду соединения с БД надо добавить строчку
      mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
      и после этого смотреть сообщение об ошибке
    3. Самое главное - SQL инъекция. Какой смысл делать регистрацию вообще, если любой дурак узнает пароли всех остальных пользователей или сможет авторизоваться вообще без пароля? Запросы надо выполнять только через подготовленные выражения
    4. И по поводу паролей. Пароли надо хранить в фаршированном виде, обработанными функцией password_hash()
    Ответ написан
    Комментировать
  • Как сделать каскадный селект?

    0xD34F
    @0xD34F Куратор тега JavaScript
    <select id="event"></select>
    <select id="dates"></select>

    const events = [
      { name: '...', dates: [ ... ] },
      { name: '...', dates: [ ... ] },
      ...
    ];
    
    const eventEl = document.querySelector('#event');
    const datesEl = document.querySelector('#dates');
    
    eventEl.innerHTML = events
      .map((n, i) => `<option value="${i}">${n.name}</option>`)
      .join('');
    
    eventEl.addEventListener('change', function() {
      datesEl.innerHTML = events[this.value].dates
        .map(n => `<option>${n}</option>`)
        .join('');
    });
    
    eventEl.dispatchEvent(new Event('change'));
    Ответ написан
  • Как грамотно реализовать пагинацию через класс?

    ThunderCat
    @ThunderCat Куратор тега PHP
    {PHP, MySql, HTML, JS, CSS} developer
    Еще раз: Тут нет никакого ооп, у вас получается какой-то процедурный код, засунутый внутрь класса. Это к ооп не имеет никакого отношения. Не пытайтесь сделать деревянную печку, ничего хорошего не получится.
    У вас:
    Код реализует (такой себе) пэйджинг для одного конкретного запроса (нахрена такой пейджинг засовывать в класс?)
    Код ничего не инкапсулирует, тупо выполняется как функция. По сути если мы уберем class Paginate extends Connection{ то ничего не поменяется.
    Внутри методов используются глобальные переменные (GET), что само по себе уже лютый говнокод.
    Много слов про солид и прочие вещи из ооп не пишу, в виду полного их отсутствия в коде, да и смысл?

    По этому решения для вашего случая в контексте ооп просто нет, так как:
    Пэйджинг работает с моделями на основе ОРМ, в пэйджинг в качестве аргумента передается модель, и далее уже пэйджинг работает с моделью, используя ее методы работы с хранилищем, а не просто тупо фигачит запросы. У вас моделей просто нет.
    Модели подразумевают конкретный интерфейс, который позволяет работать с пэйджингом адекватно. Ну и моделей нет ))
    Точкой взаимодействия между моделью и пэйджингом будет контроллер, про который тут вообще у вас никто не в курсе.
    Вывод (view) никогда не пересекается с кодом логики, в него просто передаются готовые данные, после чего они вставляются в нужные точки шаблона.
    Ответ написан
  • Видео попап. Почему неполучается сделать второе, третье всплывающее окно?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Потому что плагин кривой и не предназначен для создания нескольких экземпляров одновременно. Если посмотрите его исходный код, то там создаются элементы с фиксированными id (id="opct" и id="closer_videopopup"), а по стандарту HTML на странице не должно быть элементов с одинаковыми id.
    Ответ написан
    Комментировать
  • Как определить при помощи JS браузер пользователя и его ip?

    SPART4K
    @SPART4K
    Middle Front-end Developer (Vue.js/Nuxt.js)
    navigator.userAgent
    Информацию о браузере - устройствe и тп

    fetch('https://api.ipify.org/').then(
      r => r.text()
    ).then(console.log);

    ip
    Ответ написан
    Комментировать
  • Как запретить писать в input?

    @AntVlad
    Надо на сервере проверять данные.
    И если у тебя всё время значение wazny.com, то зачем его вообще передавать? Если проверять, откуда прилетели данные, то смотри переменную $_SERVER['HTTP_REFERER']. Но, по идее, злоумышленник и это может подделать.
    Ответ написан
    Комментировать
  • Как правильно распарсить такой массив со строками?

    0xD34F
    @0xD34F Куратор тега JavaScript
    arr.reduce((acc, n) => (
      n = n.match(/(\w+) = (.*)/),
      n && (acc[n[1]] = n[2]),
      acc
    ), {})
    Ответ написан
    2 комментария
  • Как запретить писать в input?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Никак не обезопаситься. Всегда можно посмотреть, что за запрос уходит из браузера и симмитировать его с любыми нужными полями/заголовками/куками.
    Данным, пришедшим от клиента, доверять нельзя никогда.

    P.S. Хотя для вашей ситуации можно на сервере подписать данные электронной подписью или зашифровать их и на сервере же проверять подпись/расшифровывать. Но если ключ будет один на всех, то можно будет подставить данные с другого клиента, а если ключ будет свой для каждой сессии, то проще хранить данные в сессии и не отдавать клиенту.
    Ответ написан
    2 комментария