popov/variably

处理字符串中变量的强大、简单和快速的引擎

dev-master 2019-06-19 08:17 UTC

This package is auto-updated.

Last update: 2024-09-19 20:25:20 UTC


README

过滤器准备 提供了处理数据的巨大灵活性。您可以从 HTML、CSV、Excel、SpreadSheet、Amazon 等来源获取任何类型的数据,并构建过滤链以获取所需的最优值。

Variably 具有可扩展的配置基础,允许设置任何满足要求的元素。

过滤器 进行细致且精确的工作,这专注于唯一字段(但不一定是)。

准备 做相同的工作,但需要更多资源来处理数据,这可以使用数据库或第三方服务或任何其他大量处理。

例如,以下过滤器链通过空格将字符串拆分成数组,获取数组中的第一个元素并将其解析为浮点数。

// value: "4.9 of 5 stars"
[
    'star' => ['name' => 'star', '__filter' => ['explode', 'shift', 'float']],
]
// result: 4.9

在大多数情况下,您应该使用 过滤器。谨慎使用 准备

过滤器

br2nl

将字符串中的任何 <br> HTML 标签替换为新行符号(\r\n)。

# object notation
(new FilterBr2nl())->filter('Hello, World!<br /> I am Skynet.'); 

# config notation
[
    'fieldName' => ['name' => 'fieldName', '__filter' => ['br2nl']],
]

# result
// Hello, World!
// I am Skynet.

concat

连接两个或更多字符串。

# object notation
(new FilterConcat())->filter('Hello, World! ')->setConfig(['params' => ['I am Skynet.']]); 

# config notation
[
    'fieldName' => ['name' => 'fieldName', '__filter' => ['concat:I am Skynet.']],
]
// or
[
    'fieldName' => ['name' => 'fieldName', '__filter' => [['name' => 'concat', 'params' => ['I am Skynet.']]]],
]
// or
[
    'fieldName' => ['name' => 'fieldName', '__filter' => [['name' => 'concat', 'params' => ['I ', 'am ', 'Skynet.']]]],
]

# result
// Hello, World! I am Skynet.

dateExcel

Excel 序列号 转换为标准日期格式

什么是 Excel 序列号?

Excel 将日期存储为连续的序列号,以便它们可以在计算中使用。默认情况下,1900 年 1 月 1 日是序列号 1,而 2008 年 1 月 1 日是序列号 39448,因为它距离 1900 年 1 月 1 日有 39,448 天。

# object notation
(new FilterDateExcel())->filter('42622');
(new FilterDateExcel())->filter('42622')->setConfig(['params' => ['formatFrom' => 'Y-m-d']]);

# config notation
[
    'fieldName' => ['name' => 'fieldName', '__filter' => ['dateExcel']],
]
// or
[
    'fieldName' => ['name' => 'fieldName', '__filter' => [
        ['name' => 'dateExcel', 'params' => ['formatFrom' => 'Y-m-d']]
    ]],
]

# result
// 2016-09-09

参数

  • formatTo - 输出日期格式,默认为 'Y-m-d'
  • timezone - 日期时区,默认为系统时区

dateTime

将字符串转换为标准日期格式

# object notation
(new FilterDateTime())->filter('12.07.2018');
(new FilterDateTime())->filter('12.07.2018')->setConfig(['params' => ['formatFrom' => 'd.m.Y']]);
(new FilterDateTime())->filter('12.07.2018')->setConfig(['params' => ['formatFrom' => 'd.m.Y', 'formatTo' => 'Y-m-d H:i:s']]);

# config notation
[
    'fieldName' => ['name' => 'fieldName', '__filter' => ['dateTime']],
]
// or
[
    'fieldName' => ['name' => 'fieldName', '__filter' => [
        ['name' => 'dateTime', 'params' => ['formatFrom' => 'd.m.Y']]
    ]],
]
// or
[
    'fieldName' => ['name' => 'fieldName', '__filter' => [
        ['name' => 'dateTime', 'params' => ['formatFrom' => 'd.m.Y', 'formatTo' => 'Y-m-d H:i:s']]
    ]],
]

# result
// 2018-07-12 00:00:00

参数

  • fromartFrom - 输入日期格式
  • formatTo - 输出日期格式,默认为 'Y-m-d H:i:s'
  • timezone - 日期时区,默认为系统时区

dateNative

将本地日期或日期时间值转换为标准格式(需要 Intl 库)。

# object notation
(new FilterDateNative())->filter('20 enero 2018')->setConfig(['params' => ['locale' => 'es_ES']]); // es
(new FilterDateNative())->filter('2 février 2018')->setConfig(['params' => ['locale' => 'fr_FR']]); // fr 
(new FilterDateNative())->filter('May 16, 2016')->setConfig(['params' => ['locale' => 'en_GB']]); // en 
(new FilterDateNative())->filter('27. Juni 2014')->setConfig(['params' => ['locale' => 'de_DE']]); // de 

# config notation
[
    'fieldName' => ['name' => 'fieldName', '__filter' => [
        ['name' => 'dateNative', 'params' => ['locale' => 'es_ES']]
    ]],
]
// or
[
    'fieldName' => ['name' => 'fieldName', '__filter' => [
        ['name' => 'dateNative', 'params' => ['locale' => 'fr_FR']]
    ]],
]
// or
[
    'fieldName' => ['name' => 'fieldName', '__filter' => [
        ['name' => 'dateNative', 'params' => ['locale' => 'en_GB']]
    ]],
]
// or
[
    'fieldName' => ['name' => 'fieldName', '__filter' => [
        ['name' => 'dateNative', 'params' => ['locale' => 'de_DE']]
    ]],
]

# result
// 2018-01-20
// 2018-02-02
// 2016-05-16
// 2014-06-27

参数

  • locale - 列表 of locales(可能不完整)
  • format_to - 将日期转换为格式。默认为 Y-m-d

explode

通过分隔符拆分字符串。默认分隔符为 " "(空格)。

# object notation
(new FilterExplode())->filter('apple, peas, strawberry, cherry'); 

# config notation
[
    'fieldName' => ['name' => 'fieldName', '__filter' => ['explode']],
]

# result
// ['apple', 'peas', 'strawberry', 'cherry']

multiExplode

通过分隔符拆分字符串。如果没有设置分隔符,则默认使用 " "(空格)。

# object notation
(new FilterMultiExplode())->filter('apple, peas? strawberry, cherry')->setConfig(['params' => [',','?']]);

# config notation
[
    'fieldName' => ['name' => 'fieldName', '__filter' => ['name' => 'multiExplode', 'params' => ['/', '?']]],
]

# result
// ['apple', 'peas', 'strawberry', 'cherry']

float

将可转换为数字的字符串解析为浮点数。

# object notation
(new FilterFloat())->filter(4.5); 
(new FilterFloat())->filter('4.5'); 
(new FilterFloat())->filter('4,5'); 

# config notation
[
    'fieldName' => ['name' => 'fieldName', '__filter' => ['float']],
]

# result
// 4.5

htmlEntityDecode

要将实体解码为字符,htmlEntityDecode 需要知道您想要字符使用的编码。例如,“ü”可以用 Latin-1、UTF-8、UTF-16 等多种编码表示。默认为 Latin-1。-(–,破折号)无法用 Latin-1 表示。因此它保持不变。告诉 htmlEntityDecode 将其解码为可以表示该字符的编码,例如 UTF-8。

# object notation
(new FilterHtmlEntityDecode())->filter('Hello &#8211; World!'); 

# config notation
[
    'fieldName' => ['name' => 'fieldName', '__filter' => ['htmlEntityDecode']],
]

# result
// HelloWorld!

int

将可转换为数字的字符串解析为整数。

# object notation
(new FilterInt())->filter(4.5); 
(new FilterInt())->filter('009945'); 
(new Filterint())->filter('009945-john'); 

# config notation
[
    'fieldName' => ['name' => 'fieldName', '__filter' => ['int']],
]

# result
// 4
// 9945
// 9945

merge

将值合并到其他数组中。所有标量值都将转换为数组,对象将被跳过

# object notation
(new FilterMerge())->filter(4)->setConfig(['params' => [
    [5, 10],
    [20, 30]
]]); 

# config notation
[
    'fieldName' => ['name' => 'fieldName', '__filter' => [
        ['name' => 'merge', 'params' => [
            [5, 10],
            [20, 30]
        ]]
    ]]
],

# result
// [4, 5, 10, 20, 30]

number

从值中删除所有非数字符号

# object notation
(new FilterNumber())->filter('(093) 234-56-78'); 

# config notation
[
    'fieldName' => ['name' => 'fieldName', '__filter' => ['number']],
]

# result
// 0932345678

percentageToQuantity

将总量的百分比转换为数量

# object notation
(new FilterPercentageToQuantity())->filter('20%')->setConfig(['params' => ['total' => '15']]); 

# config notation
[
    'fieldName' => ['name' => 'fieldName', '__filter' => [
        ['name' => 'percentageToQuantity', 'params' => ['total' => '15']]
    ]],
]

# result
// 3

# workflow: round((15 / 100) * 20)

percentToNumber

将百分比值转换为整数

# object notation
(new FilterPercentToNumber())->filter('3%'); 
(new FilterPercentToNumber())->filter(0.03); 

# config notation
[
    'fieldName' => ['name' => 'fieldName', '__filter' => ['percentToNumber']],
]

# result
// 3

pop

返回数组的最后一个元素

# object notation
(new FilterPop())->filter(['apple', 'peas', 'strawberry', 'cherry']); 

# config notation
[
    'fieldName' => ['name' => 'fieldName', '__filter' => ['pop']],
]

# result
// 'cherry'

shift

返回数组的第一个元素

# object notation
(new FilterPop())->filter(['apple', 'peas', 'strawberry', 'cherry']); 

# config notation
[
    'fieldName' => ['name' => 'fieldName', '__filter' => ['shift']],
]

# result
// 'apple'

regexMatch

返回正则表达式中的匹配元素

# object notation
(new FilterRegexMatch())->filter('a-star-small-5')->setConfig(['params' => ['/a-star[-\w]*-([0-5])/']]); 

# config notation
[
    'fieldName' => ['name' => 'fieldName', '__filter' => ['regexMatch:/a-star[-\w]*-([0-5])/']],
]
// or
[
    'fieldName' => ['name' => 'fieldName', '__filter' => [
        ['name' => 'regexMatch', 'params' => ['/a-star[-\w]*-([0-5])/']]
    ]],
]
// or
[
    'fieldName' => ['name' => 'fieldName', '__filter' => [
        ['name' => 'regexMatch', 'params' => ['pattern' => '/a-star[-\w]*-([0-5])/']]
    ]],
]

# result
// [5]

replace

将搜索字符串的所有出现替换为替换字符串

# object notation
(new FilterReplace())->filter('One')->setConfig(['params' => ['from' => 'One', 'to' => 1]]); 
(new FilterReplace())->filter('Eine')->setConfig(['params' => ['from' => ['One', 'Eine', 'Une'], 'to' => 1]]); 
(new FilterReplace())->filter('Une')->setConfig(['params' => ['from' => ['One', 'Eine', 'Une'], 'to' => 1]]); 

# config notation
[
    'fieldName' => ['name' => 'fieldName', '__filter' => [
        ['name' => 'replace', 'params' => [['One', 'Eine', 'A una', 'Una', 'Une'], 1]],
    ]],
]
// or
[
    'fieldName' => ['name' => 'fieldName', '__filter' => [
        ['name' => 'replace', 'params' => ['from' => ['One', 'Eine', 'A una', 'Una', 'Une'], 'to' => 1]],
    ]],
]

# result
// 1

toLower

将字符串转换为小写

# object notation
(new FilterToLower())->filter('aPpLe'); 

# config notation
[
    'fieldName' => ['name' => 'fieldName', '__filter' => ['toLower']],
]

# result
// 'apple'

toUpper

将字符串转换为大写

# object notation
(new FilterToLower())->filter('apple'); 

# config notation
[
    'fieldName' => ['name' => 'fieldName', '__filter' => ['toUpper']],
]

# result
// 'APPLE'

trim

修剪字符串。默认情况下会删除空白字符

# object notation
(new FilterTrim())->filter(' apple  '); 
(new FilterTrim())->filter('~apple~')->setConfig(['params' => ['charList' => '~']]); 

# config notation
[
    'fieldName' => ['name' => 'fieldName', '__filter' => ['trim']],
]
// or
[
    'fieldName' => ['name' => 'fieldName', '__filter' => [
        ['name' => 'trim', 'params' => ['charList' => '~']]
    ]],
]

# result
// 'apple'

准备

// TODO

针对开发者

不要犹豫,改进功能并创建PR。

自定义过滤器

可变模块是独立的,但在大多数情况下与其他模块一起用于过滤导入的数据、处理电子邮件模板等。

Zend Framework 2/3

以下示例展示了当可变模块与Popov\ZfcImporter配合使用时的情况。

// module/Custom/Module/config/module.config.php
return [
    'importer' => [
        'helpers' => [
            'CustomTagsFilter' => \Your\Module\Importer\CustomTagFilter::class,
        ],
        'tasks' => [
            'custom-task-name' => [
                'driver' => 'Excel',
                'fields' => [
                    [
                        'tag' => ['__filter' => ['customTags']],
    
                        '__table' => 'tags',
                        '__codename' => 'tag', // code name of position
                        '__identifier' => 'tag'
                    ],
                ],
            ],
        ],
    ]
];