При создании скриптов для новостей или блогов часто требуется автоматически сформировать анонс из нескольких первых предложений полного текста, не превышающий определённой длины. Типичный подход для этих целей — это выделить с помощью mb_substr начальную часть текста нужной длины, а потом обрезать получившуюся часть до последней точки.
Читать далее…
- Перово, Москва, Россия
- me@4xpro.ru
- XXXXPro
Новости сайта в Telegram
t.me/4x_proКомпьютерное
Сохранение JPEG в строку, а не файл с помощью PHP GD
Иногда при работе с изображением с помощью PHP GD может потребоваться сохранить его в строку, а не файл. Например, такое может потребоваться для вывода картинки прямо в коде страницы в формате base64-encoded.
Первое что приходит в голову — это использовать ob_start для создания дополнительного буфера вывода, вывести изображение в него, и дальше получить изображение через ob_get_clean(). Но, как выяснилось, на практике это не работает должным образом — возвращается пустая строка. Возможно, проблема в нулевых байтах или в том, что в строке есть последовательности, которые с точки зрения utf-8 являются некорректными.
Но, как выяснилось, в PHP есть другое решение: открытие файла в памяти (в качестве имени файла нужно указать "php://memory") и работа с ним как с потоком. В этом случае можно добавить стандартный потоковый фильтр, кодирующий данные в base64 на лету. Это даёт возможность избежать проблем с бинарной строкой, описанных выше. Получаем такой код:
Читать далее…
О вреде включения индексации на основе обхода по счётчикам
Есть в Яндекс.Вебмастере такая функция как индексация на основе обхода по счётчикам Метрики. На первый взгляд, достаточно безобидная, и Вебмастер активно уговаривает её включить. Но, на самом деле для качественно сделанного сайта она скорее вредна, чем полезна.
Во-первых, из-за неё может проиндексироваться то, что для индексации вовсе не предназначено, если забыть закрыть это в robots.txt. Например, на этом сайте таким объектом могли бы стать прикреплённые в закрытых разделах форума файлы, так как доступ к ним осуществляется по URL с секретной частью.
Читать далее…Выборочная очистка HTML
Как известно, любой текст, который вводится пользователем и затем отображается на сайте, нужно обезопасить от XSS-атак — вставок JavaScript, которые могут украсть идентификатор сессии или совершить какие-либо нежелательные действия от имени пользователя. Если текст не предполагает сложного форматирования, то сделать это достаточно легко: пропустить его через функцию htmlspecialchars, которая экранирует все небезопасные символы и превратит HTML в обычный текст. Но как быть, если пользователю нужно разрешить использовать форматирование текста, например, вставку картинок, ссылок, текста с курсивом и жирным начертанием, видео?
Читать далее…Немного о заголовках в PHP
Те, кто занимается разработкой на PHP уже давно и не использует frameworks, наверное, не раз сталкивались с необходимостью правильно выводить код HTTP-ответа с правильной версией протокола и текстовым описанием (например, Ok для 200, Not Found для 404 и т.д.).
Раньше для этих целей приходилось писать множество проверок условий вида:
Читать далее…
Если Windows не видит NVMе-накопитель
При установке Windows 10 на ноутбуки с процессорами Intel последних поколений NVMe-накопителем часто возникает ситуация, когда установщик Windows не показывает ни одного раздела, куда можно произвести установку. Объясняется это тем, что тем, что в чипсетах для процессоров 11 и более поздних поколений для работы с NVMe используется технология VMD. Для её работы BIOS (точнее, UEFI) подменяет реальные контроллеры NVMe на контроллер RST VMD. Но драйвера для него в дистрибутиве Windows 10 отсутствуют, поэтому установщик и не видит накопителя.
Читать далее…Часовой пояс в ботах для Telegram
Часто при разработке ботов для Telegram требуется учитывать информацию о часовом поясе пользователя. К сожалению, получить её через Bot API невозможно, поэтому предусматривать в боте команду, с помощью которой пользователь сможет указать, какой часовой пояс он использует. И тут возникает вопрос, как лучше это сделать, чтобы пользователю было удобно. Если бот ориентирован только на российских пользователей, вопрос решается просто: выводим список всех часовых поясов России, пользователь выбирает нужный, и бот сохраняет выбор в базу данных.
Но как быть, если пользователи могут быть из других стран? Выводить огромный список из более чем сотни часовых поясов — крайне неудобно. Требовать от пользователя вручную написать название его часового пояса в формате Europe/Moscow или хотя бы MSK — тоже не самое лучшее решение. Можно предложить указать смещение в формате ±ЧЧ:ММ, но тогда нельзя будет учесть переход на летнее время.
Читать далее…Избавляемся от знака вопроса в конце URL
Часто при поисковой оптимизации сайта возникает задача избавиться от URL, кончающихся на ?, например, http://4xpro/profblog/?. С точки зрения поисковых систем такие адреса воспринимаются как дубли. На первый взгляд, это кажется простой задачей: нужно прописать в .htaccess правило для mod_rewrite. Но при попытке это сделать вас ждёт неприятный сюрприз: этот знак вопроса не входит ни в ту часть URL, которая проверяется по RewriteRule, ни в переменную %{QUERY_STRING}, которую можно проверить с помощью RewriteCond. К счастью, решение всё же есть: использовать %{THE_REQUEST}, куда Apache помещает полную строку HTTP-запроса. Тогда получаем вот такое условие:
См. код в полном сообщении.
Regexp для выноса URL ссылки в скобки за её текстом
Иногда бывает нужно вынести адрес ссылки в скобки за её текстом, то есть преобразовать её из вида
в формат
Такое, например, полезно при выдаче данных в RSS, который впоследствии импортируется в Twitter.
Делается это достаточно легко с помощью такого регулярного выражения:
См. код в полном сообщении.
Как определить язык пользователя в Telegram
При разработке мультиязычного бота для Telegram возникает вопрос, на каком языке отвечать пользователю в начале диалога. Оказывается, узнать это достаточно просто: в сообщениях (объект Message) есть поле from. Оно представляет собой объект User, где имеется поле language_code, в котором и лежит код языка, выставленный у пользователя в настройках.
Итоговый код на PHP будет выглядеть примерно так:
См. код в полном сообщении.