LibCode
Темы
2 ответа
1 ответ
6 ответов
3 ответа
2 ответа
Опрос :: 7 часов назад
Выбор между классическим подходом и Jetpack Compose зависит от ваших задач:
Классический подход хорош для работы с существующими проектами и простых интерфейсов — проверен временем, много документации и примеров.
Jetpack Compose лучше подходит для новых проектов — современный, удобный, позволяет писать весь UI на Kotlin, имеет встроенные анимации и более гибкую систему состояний.
Для начинающих разработчиков Jetpack Compose может быть проще из-за единого кода и декларативного подхода. Для опытных — классический подход может быть привычнее благодаря устоявшимся практикам.
В целом, Jetpack Compose — будущее Android-разработки, но классический подход всё ещё актуален для определённых задач.
Классический подход хорош для работы с существующими проектами и простых интерфейсов — проверен временем, много документации и примеров.
Jetpack Compose лучше подходит для новых проектов — современный, удобный, позволяет писать весь UI на Kotlin, имеет встроенные анимации и более гибкую систему состояний.
Для начинающих разработчиков Jetpack Compose может быть проще из-за единого кода и декларативного подхода. Для опытных — классический подход может быть привычнее благодаря устоявшимся практикам.
В целом, Jetpack Compose — будущее Android-разработки, но классический подход всё ещё актуален для определённых задач.
Статистика доступна после голосования Публичный опрос
- Жалоба
Блог :: 20 часов назад
Kotlin — современный язык программирования, но даже опытные разработчики сталкиваются с ошибками. Рассмотрим самые распространенные проблемы и способы их решения.
NullPointerException
Причина: Обращение к null-переменной.
Решение:
Несовместимость типов
Пример: Попытка присвоить
Решение:
Неопределенные переменные
Причина: Использование необъявленных переменных.
Решение:
IndexOutOfBoundsException
Причина: Обращение к несуществующему элементу коллекции.
Решение:
IllegalStateException
Причина: некорректное состояние объекта.
Решение:
Ошибки компиляции
NullPointerException
Причина: Обращение к null-переменной.
Решение:
- Используйте безопасные вызовы (?.).
- Применяйте оператор !! с осторожностью.
- Объявляйте переменные как
val/var = something ?: defaultValue.
Несовместимость типов
Пример: Попытка присвоить
String переменной типа Int.
Решение:
- Используйте явное приведение типов.
- Проверяйте типы данных.
- Применяйте обобщенные типы (generics).
Неопределенные переменные
Причина: Использование необъявленных переменных.
Решение:
- Всегда объявляйте переменные перед использованием.
- Проверяйте область видимости переменных.
Ошибки времени выполнения
IndexOutOfBoundsException
Причина: Обращение к несуществующему элементу коллекции.
Решение:
- Проверяйте размер коллекции.
- Используйте безопасные методы доступа.
- Применяйте
letиtakeIf.
IllegalStateException
Причина: некорректное состояние объекта.
Решение:
- Добавляйте проверки состояния.
- Используйте
require()для проверки условий. - Документируйте ожидаемые состояния.
Блог :: Вчера, 3:51 pm
Для работы с JSON в Kotlin используется библиотека
Добавьте в "build.gradle" следующие зависимости:
Создайте data-класс с аннотацией
Используйте метод
Работа с коллекциями
Настройка формата JSON
Можно изменить параметры форматирования:
Игнорирование полей
Если нужно исключить некоторые поля из сериализации:
...
kotlinx.serialization. Вот как это работает:Настройка проекта
Добавьте в "build.gradle" следующие зависимости:
plugins {
kotlin("jvm") version "1.8.0"
kotlin("plugin.serialization") version "1.8.0"
}
dependencies {
implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.8.0")
}Создание модели данных
Создайте data-класс с аннотацией
@Serializable:
@Serializable
data class User(
val name: String,
val age: Int,
val email: String
)Преобразование объекта в JSON
Используйте метод
encodeToString():
fun main() {
val user = User("Иван", 25, "ivan@example.com")
// Преобразование в JSON строку
val jsonString = Json.encodeToString(user)
println(jsonString) // {"name":"Иван","age":25,"email":"ivan@example.com"}
}Дополнительные возможности
Работа с коллекциями
val users = listOf(
User("Иван", 25, "ivan@example.com"),
User("Петр", 30, "petr@example.com")
)
val jsonArray = Json.encodeToString(users)Настройка формата JSON
Можно изменить параметры форматирования:
val prettyPrintedJson = Json {
prettyPrint = true
isLenient = true
}.encodeToString(user)Игнорирование полей
Если нужно исключить некоторые поля из сериализации:
@Serializable
data class User(
val name: String,
val age: Int,
@Transient val password: String // Это поле не будет включено в JSON
)Пример полного кода
...
Блог :: Вчера, 3:02 pm
Надпись “Hello Android” может появиться в вашем приложении несколькими путями:
Шаблон проекта
При создании нового проекта в Android Studio по умолчанию может генерироваться макет с этим текстом, если выбран определённый шаблон.
Строковые ресурсы
Текст может быть прописан в файле "strings.xml" в ресурсах:
Макет активности
В файле макета (например, activity_main.xml) может быть напрямую прописан
Код активности
Текст может устанавливаться программно в MainActivity:
Кэширование проекта
Иногда старые версии ресурсов могут оставаться в кэше, из-за чего отображается не тот текст, который вы ожидаете.
Чтобы избавиться от нежелательного текста:
Если вы только начали разработку, скорее всего, это текст из шаблона, который нужно просто заменить на свой.
Шаблон проекта
При создании нового проекта в Android Studio по умолчанию может генерироваться макет с этим текстом, если выбран определённый шаблон.
Строковые ресурсы
Текст может быть прописан в файле "strings.xml" в ресурсах:
ВыделитьXML
<string name="hello_android">Hello Android</string>Макет активности
В файле макета (например, activity_main.xml) может быть напрямую прописан
TextView:
ВыделитьXML
<TextView
android:text="@string/hello_android"
... />Код активности
Текст может устанавливаться программно в MainActivity:
ВыделитьXML
textView.text = "Hello Android"Кэширование проекта
Иногда старые версии ресурсов могут оставаться в кэше, из-за чего отображается не тот текст, который вы ожидаете.
Чтобы избавиться от нежелательного текста:
- Проверьте файл "strings.xml" на наличие строки “Hello Android”.
- Посмотрите макет в "res/layout".
- Проверьте код активности на наличие прямого задания текста.
- Очистите проект через "Build → Clean Project".
- Пересоберите проект через "Build → Rebuild Project".
Если вы только начали разработку, скорее всего, это текст из шаблона, который нужно просто заменить на свой.
Блог :: 28.01.2026 07:12:27 pm
В этом уроке научимся управлять ходом программы: проверять условия и повторять действия с помощью циклов.
Конструкция
Базовый синтаксис:
Пример в "MainActivity.kt":
Важные нюансы:
Синтаксис:
Пример:
Возможности when:
Проверка ...
Условный оператор if‑else
Конструкция
if‑else позволяет выполнять разные блоки кода в зависимости от условия.Базовый синтаксис:
ВыделитьKotlin
if (условие) {
// код, если условие истинно
} else {
// код, если условие ложно
}Пример в "MainActivity.kt":
ВыделитьKotlin
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val textView = findViewById<TextView>(R.id.textView)
val age = 18
if (age >= 18) {
textView.text = "Вы совершеннолетний"
} else {
textView.text = "Вам меньше 18 лет"
}
}Важные нюансы:
- Условие должно возвращать
Boolean(true/false). - Ветку
elseможно опустить, если она не нужна. - В Kotlin
ifможет возвращать значение (как выражение):ВыделитьKotlinval status = if (age >= 18) "Взрослый" else "Ребёнок"
Оператор when (аналог switch)
when — более удобная замена множественным if‑else для проверки нескольких вариантов.Синтаксис:
ВыделитьKotlin
when (переменная) {
значение1 -> // код
значение2 -> // код
else -> // код по умолчанию
}Пример:
ВыделитьKotlin
val day = 3
val dayName = when (day) {
1 -> "Понедельник"
2 -> "Вторник"
3 -> "Среда"
4 -> "Четверг"
5 -> "Пятница"
6 -> "Суббота"
7 -> "Воскресенье"
else -> "Неверный день"
}
textView.text = dayNameВозможности when:
Проверка ...
Блог :: 28.01.2026 09:53:41 am
Структура проекта — это фундамент любого Android-приложения. Правильная организация файлов помогает:
Исходный код
Ресурсы (res/)
Дополнительные папки
Рекомендуется создавать подпапки внутри основной директории кода:
Логическое разделение
Именование папок
- Упростить разработку
- Облегчить поддержку кода
- Улучшить командную работу
- Оптимизировать сборку
Базовая структура проекта
app/
src/
main/
java/ или kotlin/
res/
assets/
AndroidManifest.xmlОсновные папки и их назначение
Исходный код
java или kotlin — содержит основной код приложения:
- Activity
- Фрагменты
- Утилиты
- Модели данных
Ресурсы (res/)
layout — XML-макеты пользовательского интерфейса:
- Макет активности
- Макет фрагмента
- Макет списка
values — файлы с ресурсами:
- strings.xml — строки
- colors.xml — цвета
- dimens.xml — размеры
- styles.xml — стили
drawable — графические ресурсы:
- Изображения
- Векторная графика
- Селекторы
mipmap — иконки приложения для разных.
anim — файлы анимации.
transition — файлы переходов между экранами.Дополнительные папки
assets — статические файлы, не обрабатываемые системой сборки.
jni — нативный код.
proguard-rules.pro — правила обфускации.Организация собственного кода
Рекомендуется создавать подпапки внутри основной директории кода:
kotlin/
com/
example/
app/
ui/ # UI компоненты
data/ # Работа с данными
repository/ # Хранилище данных
network/ # Сетевые запросы
utils/ # УтилитыРекомендации по организации
Логическое разделение
- Группируйте файлы по функциональности.
- Используйте осмысленные названия.
Именование папок
- Соблюдайте единообразие.
- Исп
Блог :: 28.01.2026 06:38:19 am
В этом уроке разберём основы работы с данными: как хранить информацию, какие типы существуют и как показывать текст прямо в интерфейсе приложения.
В Kotlin две ключевые конструкции для объявления переменных:
Пример в коде (
Когда что использовать
Как указать тип явно (редко нужно — Kotlin выводит тип автоматически):
До сих пор мы...
Переменные: "val" vs "var"
В Kotlin две ключевые конструкции для объявления переменных:
val— неизменяемая переменная (аналог константы). После присвоения значения его нельзя поменять.var— изменяемая переменная. Значение можно перезаписывать.
Пример в коде (
MainActivity.kt):
ВыделитьKotlin
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val greeting = "Привет!" // val — нельзя изменить
var counter = 0 // var — можно менять
counter = counter + 1 // работает
// greeting = "Пока!" // ошибка: нельзя перезаписать val
}
Когда что использовать
val— для данных, которые не должны меняться (названия, настройки).var— для счётчиков, динамических значений.
Основные типы данных
String: (Пример:"Текст") Строка символов.Int: (Пример:42) Целое число (от −2 147 483 648 до 2 147 483 647).Long: (Пример:10000000000L) Большое целое число.Double: (Пример:3.14) Число с плавающей точкой (высокая точность).Float: (Пример:3.14f) Число с плавающей точкой (меньшая точность).Boolean: (Пример:true / false) Логическое значение.
Как указать тип явно (редко нужно — Kotlin выводит тип автоматически):
ВыделитьKotlin
val username: String = "Alice"
val age: Int = 25Вывод текста на экран приложения
До сих пор мы...
Блог :: 27.01.2026 08:09:44 pm
Kotlin — это современный статически типизированный язык программирования, работающий на платформе JVM (Java Virtual Machine). Разработан компанией JetBrains и официально представлен в 2011 году. В 2017 году Google объявил Kotlin приоритетным языком для разработки под Android.
Шаг 1. Установите Android Studio:
Шаг 2. Настройте интерфейс (опционально):
Шаг 1. На стартовом экране выберите: "Start a new Android Studio project".
Шаг 2. Выберите шаблон: "Empty Activity" → нажмите "Next".
Шаг 3. Заполните параметры проекта:
Ключевые преимущества
- Совместимость с Java: можно использовать существующие Java-библиотеки.
- Краткость кода: меньше шаблонного кода по сравнению с Java.
- Безопасность: встроенная защита от
NullPointerException. - Функциональные возможности: лямбды, расширения, корутины.
- Мультиплатформенность: поддержка Android, серверных приложений, фронтенда (через Kotlin/JS).
Установка среды разработки
Шаг 1. Установите Android Studio:
- Скачайте установочный файл с официального сайта: https://developer.android.com/studio (Программы для разработки Android-приложений).
- Запустите установщик и следуйте инструкциям.
- При первом запуске выберите:
- "Do not import settings → OK";
- примите лицензионные соглашения;
- дождитесь загрузки компонентов (SDK, эмулятор и др.).
Шаг 2. Настройте интерфейс (опционально):
- Откройте "File → Settings".
- В разделе "Appearance & Behavior → Theme" выберите тему (например, "Darcula").
- В "Editor → Font" настройте размер шрифта для удобства.
Создаём первый проект
Шаг 1. На стартовом экране выберите: "Start a new Android Studio project".
Шаг 2. Выберите шаблон: "Empty Activity" → нажмите "Next".
Шаг 3. Заполните параметры проекта:
- Name:
HelloWorldApp(название приложения); - Package name:
com.example.helloworldapp(уникаль
Блог :: 27.01.2026 07:08:16 pm
Ссылки на необходимые программы для разработки Android-приложений:
Необходим для работы Android Studio, так как она основана на Java. Можно использовать JDK от Oracle: https://www.oracle.c ... gies/downloads/.
Официальная интегрированная среда разработки (IDE) от Google. Скачать можно с официального сайта для разработчиков Android: https://developer.android.com/.
Java Development Kit (JDK)
Необходим для работы Android Studio, так как она основана на Java. Можно использовать JDK от Oracle: https://www.oracle.c ... gies/downloads/.
Android Studio
Официальная интегрированная среда разработки (IDE) от Google. Скачать можно с официального сайта для разработчиков Android: https://developer.android.com/.
Блог :: 26.01.2026 12:22:31 pm
javascript:void(0) — это синтаксическая конструкция, которую традиционно использовали в атрибуте href HTML‑ссылок для предотвращения перехода по умолчанию.Пример:
ВыделитьHTML
<a href="javascript:void(0)" onclick="doSomething()">Кликни меня</a>При клике браузер выполняет JavaScript‑код, но
void(0) возвращает undefined, что принудительно отменяет навигацию (переход на другую страницу).Как это работает на практике
- Браузер видит
href="javascript:..."и интерпретирует содержимое как JS‑код. void(0)вычисляется вundefined.- Поскольку возвращаемое значение не является валидным URL, переход блокируется.
Почему этот подход считается устаревшим
Несмотря на работоспособность,
javascript:void(0) имеет критические недостатки:Проблемы с доступностью (a11y)
- Скринридеры озвучивают
javascript:void(0)как текст ссылки, создавая путаницу. - Клавиатурная навигация (Tab) работает некорректно.
- Нарушается принцип семантической разметки.
SEO‑риски
- Поисковые роботы игнорируют ссылки с
javascript:. - Может расцениваться как признак некачественного кода.
Поддержка кода
- Смешение HTML и JS в одном атрибуте усложняет рефакторинг.
- Трудно тестировать и отлаживать.
Безопасность
- В некоторых контекстах может провоцировать XSS‑уязвимости.
- Блокировщики рекламы и расширения могут отключать такие ссылки.
UX‑нюансы
- Не меняется статус посещённой ссылки (
:visited). - Возможны неожиданные прокрутки страницы.
Современные альтернативы
Используйте <button> для действий без навигации
Если ссылка нужна только для запуска JS‑кода —...
Блог :: 10.01.2026 06:49:36 pm
Что такое EXIF и зачем он нужен
EXIF (Exchangeable Image File Format) — это стандарт, позволяющий добавлять к изображениям и другим файлам метаданные: информацию о камере, настройках съёмки, дате, геолокации и ориентации снимка.
Эти данные записываются камерой или смартфоном при создании фото и могут быть прочитаны специальными инструментами, в том числе PHP‑функцией
exif_read_data().Как EXIF хранит информацию о повороте
Ключевой параметр для определения поворота — поле Orientation (ориентация). Оно принимает значения от
1 до 8, каждое из которых описывает определённое положение камеры при съёмке:
1: нормальное положение (0°);3: повёрнуто на 180°;6: повёрнуто на 90° по часовой стрелке;8: повёрнуто на 90° против часовой стрелки.
Остальные значения (2, 4, 5, 7) описывают зеркальные повороты, которые встречаются реже.
Практический пример на PHP
Шаг 1. Чтение EXIF‑данных
Используйте функцию
exif_read_data(), чтобы получить метаданные изображения:
ВыделитьPHP
$exifData = exif_read_data('path/to/your/image.jpg');Шаг 2. Проверка наличия поля Orientation
Убедитесь, что поле
Orientation присутствует:
ВыделитьPHP
if (isset($exifData['Orientation'])) {
$orientation = $exifData['Orientation'];
echo "Ориентация: $orientation";
} else {
echo "Поле Orientation не найдено.";
}
Шаг 3. Анализ значения Orientation
Сравните значение с известными кодами:
ВыделитьPHP
switch ($orientation) {
case 1:
echo "Изображение не повернуто.";
break;
case 3:
Блог :: 25.12.2025 07:42:59 am
Функция
Синтаксис функции
Параметры:
Установка простого cookie
Установка безопасного cookie
Удаление cookie
Функция
Функция setcookie() — это важный инструмент для работы с состоянием пользователя в PHP. Её правильное использование позволяет улучшить взаимодействие с пользователями и повысить удобство работы с сайтом.
...
setcookie() в PHP предназначена для отправки cookie-данных клиенту. Cookie — это небольшие кусочки информации, которые хранятся на стороне клиента и отправляются обратно серверу при каждом последующем запросе. Это позволяет сохранять состояние пользователя между запросами.Синтаксис функции
setcookie():
ВыделитьPHP
setcookie(name, value, expire, path, domain, secure, httponly)Параметры:
name: Имя cookie.value: Значение cookie.expire: Время истечения срока действия cookie (timestamp Unix).path: Путь на сервере, к которому относятся cookie.domain: Домен, к которому относятся cookie.secure: Отправлять cookie только через зашифрованное соединение (HTTPS).httponly: Заблокировать доступ к cookie через JavaScript.
Примеры использования
Установка простого cookie
ВыделитьPHP
setcookie("username", "John", time() + 3600, "/");Установка безопасного cookie
ВыделитьPHP
setcookie("auth_token", "secret-token", time() + 3600, "/", ".example.com", true, true);Удаление cookie
ВыделитьPHP
setcookie("username", "", time() - 3600, "/");Практическое применение
Функция
setcookie() широко используется для аутентификации пользователей, отслеживания сессий и персонализации контента. Она позволяет сохранять информацию о пользователе между запросами, что улучшает пользовательский опыт.Заключение
Функция setcookie() — это важный инструмент для работы с состоянием пользователя в PHP. Её правильное использование позволяет улучшить взаимодействие с пользователями и повысить удобство работы с сайтом.
...
Блог :: 11.12.2025 07:17:59 am
Расширенные возможности регулярных выражений в PHP позволяют решать более сложные задачи, такие как обработка текста, очистка данных и защита от уязвимостей. Рассмотрим некоторые из этих возможностей.
Захват групп: Группы позволяют извлекать определенные фрагменты текста:
Обратные ссылки: Обратные ссылки позволяют использовать захваченные группы в замене:
Positive Lookahead: Проверяет, что после текущего положения есть определенный паттерн:
Negative Lookahead: Проверяет, что после текущего положения нет определенного паттерна:
Positive Lookbehind: Проверяет, что перед текущим положением есть определенный паттерн:
Negative Lookbehind: Проверяет, что перед текущим положением нет определенного паттерна:
...
Захват групп и обратные ссылки
Захват групп: Группы позволяют извлекать определенные фрагменты текста:
ВыделитьPHP
preg_match('/(\d+) (\w+)/', '123 apples', $matches);
// $matches[1] => '123', $matches[2] => 'apples'Обратные ссылки: Обратные ссылки позволяют использовать захваченные группы в замене:
ВыделитьPHP
preg_replace('/(\w+) (\w+)/', '$2, $1', 'John Doe');
// Результат: 'Doe, John'Утверждения (Lookahead и Lookbehind)
Positive Lookahead: Проверяет, что после текущего положения есть определенный паттерн:
ВыделитьPHP
preg_match('/apple(?= pie)/', 'I love apple pie'); // Вернет trueNegative Lookahead: Проверяет, что после текущего положения нет определенного паттерна:
ВыделитьPHP
preg_match('/apple(?! pie)/', 'I love apple juice'); // Вернет truePositive Lookbehind: Проверяет, что перед текущим положением есть определенный паттерн:
ВыделитьPHP
preg_match('/(?<=love )apple/', 'I love apple'); // Вернет trueNegative Lookbehind: Проверяет, что перед текущим положением нет определенного паттерна:
ВыделитьPHP
preg_match('/(?<!love )apple/', 'I hate apple'); // Вернет trueРежимы и флаги
i (case-insensitive): Игнорирует регистр символов:
ВыделитьPHP
preg_match('/apple/i', 'APPLE'); // Вернет truem (multiline): Позволяет использовать ^ и $ для начала и конца каждой строки:
...
Блог :: 11.12.2025 06:57:37 am
Достижение высокой производительности и оптимальной работы с памятью — одна из ключевых задач разработчика на PHP. В условиях роста нагрузки и объема данных эффективное использование ресурсов становится критически важным фактором успеха проекта. Давайте рассмотрим некоторые лучшие практики и приемы для достижения максимальной производительности и экономии памяти в PHP-приложениях.
1. Использование Opcode Cache (OPCache)
Один из важнейших шагов к повышению производительности — включение и правильная настройка OPCache. Этот механизм сохраняет скомпилированный байткод PHP, предотвращая повторную компиляцию каждого файла при каждом запросе.
Советы по настройке OPCache:
2. Эффективная работа с ресурсами
В зависимости от размера проекта и используемых данных, разумное потребление ресурсов может существенно повысить производительность.
Методы эффективной работы с ресурсами:
3. Минимизация затрат на память
Каждый объект или массив занимает определенный...
Высокопроизводительность и оптимизация памяти в PHP
1. Использование Opcode Cache (OPCache)
Один из важнейших шагов к повышению производительности — включение и правильная настройка OPCache. Этот механизм сохраняет скомпилированный байткод PHP, предотвращая повторную компиляцию каждого файла при каждом запросе.
Советы по настройке OPCache:
- Включайте и настраивайте OPCache через конфигурационные файлы (
opcache.enable=1,opcache.memory_consumption=128,opcache.max_accelerated_files=10000). - Регулярно очищайте кэш, если вносите значительные изменения в кодовую базу.
2. Эффективная работа с ресурсами
В зависимости от размера проекта и используемых данных, разумное потребление ресурсов может существенно повысить производительность.
Методы эффективной работы с ресурсами:
- Ограничивайте размер и частоту подключаемых файлов через автозагрузчик классов (
spl_autoload_register). - Закрывайте неиспользуемые подключения к БД и другим ресурсам (например, файловым дескрипторам).
- Минимизируйте количество глобальных переменных и статичных объектов.
3. Минимизация затрат на память
Каждый объект или массив занимает определенный...
Блог :: 07.12.2025 05:46:36 pm
Регулярные выражения (регэкспы) — мощный инструмент для работы с текстом, позволяющий решать широкий спектр задач, связанных с поиском, извлечением и обработкой данных. Одна из распространенных задач — разбор URL-адресов, когда нужно извлечь отдельные части (модуль, тип, идентификатор) из URL. В этой статье мы рассмотрим, как это сделать с помощью функции
Рассмотрим шаблон регулярного выражения, который помогает извлечь части URL:
Допустим, у нас есть URL:
Результат:
...
preg_match() в PHP.Пример регулярного выражения
Рассмотрим шаблон регулярного выражения, который помогает извлечь части URL:
ВыделитьPHP
preg_match('%^/(?<module>[-\w\d]+)(?:/(?<type>[-\w\d]+))?(?:/(?<id>[-\w\d]+))?/?$%', $urlPath, $match);Разбор регулярного выражения
%^/: начало строки, после которого идёт косая черта (/).(?<module>[-\w\d]+): именованная группа захвата для выделения модуля. Допускаются буквы, цифры, тире и подчёркивание.(?:/(?<type>[-\w\d]+))?: необязательная группа захвата для типа. Опционально присутствует после косой черты.(?:/(?<id>[-\w\d]+))?: необязательная группа захвата для идентификатора. Опционально присутствует после косой черты./?$: необязательная завершающая косая черта в конце строки.
Пример использования
Допустим, у нас есть URL:
/blog/post/123:
ВыделитьPHP
$urlPath = '/blog/post/123';
preg_match('%^/(?<module>[-\w\d]+)(?:/(?<type>[-\w\d]+))?(?:/(?<id>[-\w\d]+))?/?$%', $urlPath, $match);
if (!empty($match)) {
print_r($match);
}Результат:
ВыделитьPHP
Array
(
[0] => /blog/post/123
[module] => blog
[1] => blog
[type] => post
[2] => post
[id] => 123
[3]
