slexx/pattern

v1.2.1 2017-07-31 07:19 UTC

This package is auto-updated.

Last update: 2024-03-08 06:02:31 UTC


README

Latest Stable Version Total Downloads Latest Unstable Version License

Установка

$ 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