Pattern
, (*1)
Установка
$ composer require slexx/pattern
Базовое использование
Это новый язык шаблонов схожий с регулярными выражениями, но значительно проще. Основной класс имеет всего несколько методов, а сам язык прост как валенок. Компилируется в регулярное выражение., (*2)
Пример шаблона:, (*3)
/users[/<id:int>[/<action:edit|delete>]]
Он компилируется в следующее регулярное выражение:, (*4)
/^\/users(?:\/(?P<id>[1-9][0-9]*|0)(?:\/(?P<action>edit|delete))?)?(?:\/)?$/
Первый вариант намного легче читается и сним проще работать., (*5)
Пример использования:, (*6)
use Slexx\Pattern\Pattrn;
$pattern = new Pattern('/users/<id:int>');
var_dump($pattern->match('/users/5')); // -> ['id' => 5]
Документация
Текст
В любом тексте который не является синтаксической единицой языка, будут экранированы все символы регулярных выражений., (*7)
Правило |
Регулярное выражение |
users/<id>/ |
/^users\/(?P<id>.+)\/$/ |
Не обязательное
Всё не обязательное, то чо может осуцтвовать в тексте по тем или иным присинам можно просто обнести квадратными скобками., (*8)
Правило |
Регулярное выражение |
foo[|bar] |
/^foo(?:\|bar)?$/ |
Параметры
Параметры обносятся знаком меньше слева и знаком больше справа, их можно использовать
для того что бы найти какуюто часть текста., (*9)
Правило |
Регулярное выражение |
users/<id>/<action> |
/^users\/(?P<id>.+)\/(?P<action>.+)(?:\/)?$/ |
Правила
В параметре через двоеточие можно указать имя правила для валидации параметра или
регулярное выражение., (*10)
Правило |
Регулярное выражение |
/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
в котором первый аргумент
имя параметра, а второй регулярное выражение., (*11)
$pattern = new Pattern('users show <id:slug>');
$pattern->rule('slug', '[\w\d\-]+');
$pattern->match('users show alex1234');
// -> ['slug' => 'alex1234'];
$pattern->match('users show {}+');
// -> null
Стандартные правила
Для удобства уже реализовано несколько правил, вот их список:, (*12)
Правило |
Псевдоним |
Регулярное выражение |
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_\-]+ |
Правило по умолчанию
Если не указывать правило то будет использовано следующее регулярное выражение: .+
., (*13)
Приведение типов
Для некоторых стандартных правил работает приведение типов:, (*14)
- int, integer
- float, double
- bool, boolean
Для все остальных случаев возвращается строка., (*15)
$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
где первым аргументом следует имя параметра, а вторым значение по умолчанию., (*16)
$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
., (*17)
$pattern = new Pattern('users/<id:int>[/]');
$pattern->is('users'); // -> false
$pattern->is('users/5'); // -> true
$pattern->is('/users/5/'); // -> true