ekinhbayar/interval-parser

区间解析器。仍在开发中。

0.1.2 2017-04-01 01:24 UTC

This package is auto-updated.

Last update: 2024-09-15 00:12:35 UTC


README

Build Status Scrutinizer Code Quality Code Coverage

这是一个正在进行中的作品。

这个库提供了三个类

  1. IntervalFinder,寻找时间区间和任何前导/尾随数据,并以一个TimeInterval对象的形式返回。

IntervalFinder::find(string $input, int $flags) : TimeInterval

  1. Parser,接收一个字符串,并通过以下3#方法将其转换为DateInterval。

Parser::parse(string $input): \DateInterval

  1. Normalizer,寻找并替换与非strtotime兼容的缩写,以兼容的缩写替换。它不接受前导数据,但会返回尾随数据并保留已兼容的缩写。

Normalizer::normalize(string $input): string

IntervalFinder::find方法允许的标志

class IntervalFlags
{
    const INTERVAL_ONLY      = 0b00000000;
    const REQUIRE_TRAILING   = 0b00000001;
    const REQUIRE_LEADING    = 0b00000010;
    const MULTIPLE_INTERVALS = 0b00000100;
}

IntervalFinder接收一个ParserSettings对象,允许您设置要使用的分隔符,默认为

string $leadingSeparationString = 'in',
bool $keepLeadingSeparator = false,
int $multipleSeparationType = self::SYMBOL,
string $multipleSeparationSymbol  = ',',
string $multipleSeparationWord = 'foo'

TimeInterval是一个值对象,表示一段时间区间。它基本上是一个包含额外信息的DateInterval。

  int $intervalOffset
  int $intervalLength
  DateInterval $interval
  string $leadingData
  string $trailingData

安装

$ composer require ekinhbayar/interval-parser

基本用法

/**
 * Some other example inputs:
 *
 * foo in 7 weeks 8 days
 * 9 months 8 weeks 7 days 6 hours 5 minutes 2 seconds baz
 * remind me I have 10 minutes in 2 hours please
 *
 */
$trailing = '7mon6w5d4h3m2s bazinga!';
$leading  = 'foo in 9w8d7h6m5s';
$both = 'foo in 9d8h5m bar';
$onlyInterval = '9 mon 2 w 3 m 4 d';

# Set ParserSettings for IntervalFinder
$settings = new ParserSettings("in", false);
$intervalFinder = new IntervalFinder($settings, new Normalizer());

$intervalAndTrailing = $intervalFinder->find($trailing, IntervalFlags::REQUIRE_TRAILING);
var_dump($intervalAndTrailing);

$intervalAndLeading = $intervalFinder->find($leading, IntervalFlags::REQUIRE_LEADING);
var_dump($intervalAndLeading);

$intervalWithBoth = $intervalFinder->find($both, IntervalFlags::REQUIRE_TRAILING | IntervalFlags::REQUIRE_LEADING);
var_dump($timeIntervalWithBoth);

$intervalParser = new Parser(new Normalizer());

$dateInterval = $intervalParser->parse($onlyInterval);
var_dump($dateInterval);

# Multiple Intervals

# 1. Comma Separated
$multiple = 'foo in 9d8h5m bar , baz in 5 minutes, foo in 2 days 4 minutes boo, in 1 hr, 10 days';
$multipleIntervals = $intervalFinder->find($multiple, IntervalFlags::MULTIPLE_INTERVALS);
var_dump($multipleIntervals);

# 2. Separated by a defined-on-settings word

$settings = new ParserSettings("in", 1, ',', 'then');
$intervalFinder = new IntervalFinder($settings);

$wordSeparated = 'foo in 9d8h5m bar then baz in 5 minutes then foo in 2 days 4 minutes boo then in 1 hr then 10 days';
$wordSeparatedIntervals = $intervalFinder->find($wordSeparated, IntervalFlags::MULTIPLE_INTERVALS);
var_dump($wordSeparatedIntervals);

非常感谢 PeeHaaDaveRandombwoebipcrov,感谢他们让我学到的一切,以及他们所有的帮助!:-)