slexx / pattern
Installs: 61
Dependents: 2
Suggesters: 0
Security: 0
Stars: 2
Watchers: 0
Forks: 0
Open Issues: 0
pkg:composer/slexx/pattern
Requires (Dev)
- phpunit/phpunit: ^6.2
This package is auto-updated.
Last update: 2025-11-08 09:26:26 UTC
README
Установка
$ composer require slexx/pattern
Базовое использование
Это новый язык шаблонов схожий с регулярными выражениями, но значительно проще. Основной класс имеет всего несколько методов, а сам язык прост как валенок. Компилируется в регулярное выражение.
Пример шаблона:
/users[/<id:int>[/<action:edit|delete>]]
Он компилируется в следующее регулярное выражение:
/^\/users(?:\/(?P<id>[1-9][0-9]*|0)(?:\/(?P<action>edit|delete))?)?(?:\/)?$/
Первый вариант намного легче читается и сним проще работать.
Пример использования:
use Slexx\Pattern\Pattrn; $pattern = new Pattern('/users/<id:int>'); var_dump($pattern->match('/users/5')); // -> ['id' => 5]
Документация
Текст
В любом тексте который не является синтаксической единицой языка, будут экранированы все символы регулярных выражений.
| Правило | Регулярное выражение |
|---|---|
users/<id>/ |
/^users\/(?P<id>.+)\/$/ |
Не обязательное
Всё не обязательное, то чо может осуцтвовать в тексте по тем или иным присинам можно просто обнести квадратными скобками.
| Правило | Регулярное выражение |
|---|---|
foo[|bar] |
/^foo(?:\|bar)?$/ |
Параметры
Параметры обносятся знаком меньше слева и знаком больше справа, их можно использовать для того что бы найти какуюто часть текста.
| Правило | Регулярное выражение |
|---|---|
users/<id>/<action> |
/^users\/(?P<id>.+)\/(?P<action>.+)(?:\/)?$/ |
Правила
В параметре через двоеточие можно указать имя правила для валидации параметра или регулярное выражение.
| Правило | Регулярное выражение |
|---|---|
/users/<id:int>/ |
/^\/users\/(?P<id>[1-9][0-9]*|0)\/$/ |
<year:\d{4}>-<month:\d{2}> |
/^(?P<year>\d{4})-(?P<month>\d{2})$/ |
Установка правил
Для установки правила можно воспользоватся методом rule в котором первый аргумент
имя параметра, а второй регулярное выражение.
$pattern = new Pattern('users show <id:slug>'); $pattern->rule('slug', '[\w\d\-]+'); $pattern->match('users show alex1234'); // -> ['slug' => 'alex1234']; $pattern->match('users show {}+'); // -> null
Стандартные правила
Для удобства уже реализовано несколько правил, вот их список:
| Правило | Псевдоним | Регулярное выражение |
|---|---|---|
| integer | int | [1-9][0-9]*|0 |
| float | double | (?:[1-9][0-9]*|0)\.[0-9]* |
| number | (?:[1-9][0-9]*|0)(?:\.[0-9]*)? |
|
| string | (?:.|[^.])+ |
|
| boolean | bool | true|false|0|1|on|off |
| word | \w+ |
|
| slug | [\w\d_\-]+ |
Правило по умолчанию
Если не указывать правило то будет использовано следующее регулярное выражение: .+.
Приведение типов
Для некоторых стандартных правил работает приведение типов:
- int, integer
- float, double
- bool, boolean
Для все остальных случаев возвращается строка.
$pattern = new Pattern('users list[ --verbose[ <verbose:bool>]][ --offset <offset:int>][ --limit <limit:int>]'); $pattern->match('users list --verbose on --offset 5'); // -> ['verbose' => true, 'offset' => 5, 'limit' => null];
Значения по умолчанию
Для типа boolean по умолчанию возвращается false, для всех остальных null. Значение по умолчанию можно указать с помощью метода default где первым аргументом следует имя параметра, а вторым значение по умолчанию.
$pattern = new Pattern('users list[ --verbose[ <verbose:bool>]][ --offset <offset:int>][ --limit <limit:int>]'); $pattern->default('limit', 50); $pattern->default('verbose', true); $pattern->match('users list --offset 5'); // -> ['verbose' => true, 'offset' => 5, 'limit' => 50];
Проверка
Для проверки текста на соотвецтвие шаблону есть иетод is, он принимает строку
первым параметром и возвращает boolean.
$pattern = new Pattern('users/<id:int>[/]'); $pattern->is('users'); // -> false $pattern->is('users/5'); // -> true $pattern->is('/users/5/'); // -> true