定制 di/expression-parser 二次开发

按需修改功能、优化性能、对接业务系统,提供一站式技术支持

邮箱:yvsm@zunyunkeji.com | QQ:316430983 | 微信:yvsm316

di/expression-parser

Composer 安装命令:

composer require di/expression-parser

包简介

This package allows to evaluate (parse with mapping) large amounts of data in flexible manner, providing various processing functions

README 文档

README

Build Status Last version License

This package allows to evaluate (parse with mapping) large amounts of data in flexible manner, providing various processing functions:

🔩 Install

composer install di/expression-parser

⚒ Usage

// Signature
$expression = new Expression(string $expression[, array $mappings = []]);

👀 Example

use DI\ExpressionParser\Expression;

$expression = 'or_x(equal([attr1], 1), in_array(explode([keywords]), "hello"))';

$mappings = [
    'attr1' => 1,
    'keywords' => 'hello,world',
];

$ex = new Expression($expression, $mappings);

echo $ex->value(); // true

Standard function handlers

🔗 Parameter substitution

📥 Input:

new Expression(
    '[attr1]',
    [
        'attr1' => 1,
        'attr2' => 2,
    ]
)

📤 Output: 1

🔗 Parameter substitution with has() function

📥 Input:

new Expression(
    'has([attr1])',
    [
        'attr1' => 1,
        'attr2' => 2,
    ]
)

📤 Output: true

🔗 Substitution with in_array() function and scalar value

📥 Input:

new Expression(
    'in_array([keywords], "hello")',
    [
        'keywords' => [
            'hello',
            'world',
        ],
    ]
)

📤 Output: true

🔗 Nested in_array() and explode() function and scalar value

📥 Input:

new Expression(
    'in_array(explode([keywords]), "hello")',
    [
        'keywords' => 'hello,world',
    ]
)

📤 Output: true

🔗 Substitution with matches_in_array() function

📥 Input:

new Expression(
    'matches_in_array([keywords], "pool")',
    [
        'keywords' => [
            'swimming pool',
        ],
    ]
)

📤 Output: true

🔗 Nested explode() is_empty() and functions

📥 Input:

new Expression(
    'is_empty(explode([keywords]))',
    [
        'keywords' => '',
    ]
)

📤 Output: true

🔗 implode() with inline parameter substitution

📥 Input:

new Expression(
    'implode(([attr1],[attr2]))',
    [
        'attr1' => 1,
        'attr2' => 2,
    ]
)

📤 Output: hello world

🔗 implode() with inline parameter substitution and a separator flag

📥 Input:

new Expression(
    'implode(([attr1],[attr2]), ",")',
    [
        'attr1' => 1,
        'attr2' => 2,
    ]
)

📤 Output: hello,world

🔗 explode() with array substitution

📥 Input:

new Expression(
    'explode([Rooms])',
    [
        'Rooms' => 'Pantry,Study',
    ]
)

📤 Output: ['Pantry', 'Study']

Standard handlers with one or multiple flags

🔗 explode() with array substitution and a separator flag

📥 Input:

new Expression(
    'explode([Rooms], ";")',
    [
        'Rooms' => 'Pantry;Study',
    ]
)

📤 Output: ['Pantry', 'Study']

🔗 get() function with count and nullable flags

📥 Input:

new Expression(
    'get([attr1], {"count":true, "nullable":false})',
    [
        'attr1' => [
            'a',
            'b',
            'c',
        ],
    ]
)

📤 Output: 3

🔗 Nested mapping with map flag in get() function

📥 Input:

new Expression(
    'get([attr1], {"map":{"a":1, "b": 2, "c": 3}})',
    [
        'attr1' => 'b',
    ]
)

📤 Output: 2

🔗 Case sensitive matching in array with sensitive flag

📥 Input:

new Expression(
    'matches_in_array([keywords], "pool", {"sensitive":true})',
    [
        'keywords' => [
            'Swimming Pool',
        ],
    ]
)

📤 Output: false

Logical handlers

🔗 equal() function

📥 Input:

new Expression(
    'equal([attr1], 1)',
    [
        'attr1' => 1,
        'attr2' => 2,
    ]
)

📤 Output: true

🔗 great_than() function

📥 Input:

new Expression(
    'great_than([attr1], 0)',
    [
        'attr1' => 1,
        'attr2' => 2,
    ]
)

📤 Output: true

🔗 Nested not() and equal() functions

📥 Input:

new Expression(
    'not(equal([attr1], 2))',
    [
        'attr1' => 1,
        'attr2' => 2,
    ]
)

📤 Output: true

🔗 Nested not() and equal() functions

📥 Input:

new Expression(
    'not(equal([attr1], 2))',
    [
        'attr1' => 1,
        'attr2' => 2,
    ]
)

📤 Output: true

Complex functions with unlimited nesting level

🔗 Multiple function parameter substitution with nesting with and_x()

📥 Input:

new Expression(
    'and_x(equal([attr1], 1), in_array(explode([attr2]), "hello"))',
    [
        'attr1' => 1,
        'attr2' => 'hello,world',
    ]
)

📤 Output: true

🔗 Multiple function parameter substitution with nesting with or_x()

📥 Input:

new Expression(
    'or_x(equal([attr1], 1), in_array(explode([attr2]), "hello"))',
    [
        'attr1' => 1,
        'attr2' => 'hello,world',
    ]
)

📤 Output: true

🔗 Multiple function parameter substitution with nesting with or_x() and not()

📥 Input:

new Expression(
    'not(or_x(equal([attr1], 1), in_array(explode([attr2]), "word")))',
    [
        'attr1' => 2,
        'attr2' => 'hello,world',
    ]
)

📤 Output: true

😳 Multiple nesting with a Closure

📥 Input:

new Expression(
    'first(take(sort(filter([attr1], [filter_func]), [dir]), [offset]))',
    [
        'attr1' => [
            10,
            30,
            20,
        ],
        'filter_func' => function (ExpressionParser $context, $value) {
            return array_filter($value, function ($item) use ($context) {
                return $item < $context->getMappings('filter_attr');
            });
        },
        'filter_attr' => 30,
        'dir' => 'desc',
        'offset' => 1,
    ]
)

📤 Output: 20

Laravel Collection helpers

The package already has a built-in support of Laravel Collection helpers. For more informations about the available functions it supports please refer to the original Laravel Collection documentation page.

🔗 Example usage of Laravel Collection functions

📥 Input:

new Expression(
    'first(collect([attr1], [attr2]))',
    [
        'attr1' => 'value 1',
        'attr2' => 'value 2',
    ]
)

📤 Output: 'value 1'

Extending with custom handlers

In order to extend or override current functionality, you will need to add your own handler class name to config/handlers.php file:

use DI\ExpressionParser\Handlers\Logical;
use DI\ExpressionParser\Handlers\Standard;
use DI\ExpressionParser\Handlers\LaravelCollectionAdapter;

return [
    Standard::class,
    Logical::class,
    LaravelCollectionAdapter::class,

    // Add custom expression handlers here:
    // \Acme\Handlers\CustomHandler::class,
    // 'Acme\Handlers\CustomHandler',
];

😍 Contribution

Please feel free to fork and help developing.

📃 License

MIT

统计信息

  • 总下载量: 8
  • 月度下载量: 0
  • 日度下载量: 0
  • 收藏数: 12
  • 点击次数: 0
  • 依赖项目数: 0
  • 推荐数: 0

GitHub 信息

  • Stars: 12
  • Watchers: 1
  • Forks: 0
  • 开发语言: PHP

其他信息

  • 授权协议: BSD-3-Clause
  • 更新时间: 2018-04-19

承接程序开发

PHP开发

VUE

Vue开发

前端开发

小程序开发

公众号开发

系统定制

数据库设计

云部署

网站建设

安全加固