popov / variably
处理字符串中变量的强大、简单和快速的引擎
Requires
- php: ^7.0
- maciejczyzewski/bottomline: *
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 – World!'); # config notation [ 'fieldName' => ['name' => 'fieldName', '__filter' => ['htmlEntityDecode']], ] # result // Hello – World!
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' ], ], ], ], ] ];