PHP 中的日期正则表达式



我在编写正则表达式时遇到了一些麻烦(我不精通它),并且还没有弄清楚我的下一步应该是什么。我正在尝试做的是使用 PHP 将一些文本块提取到数组中。文本如下所示:

星期六, 八月 03, 2013 转储皮卡:小石城,AR 目的地:德克萨斯州考德威尔  料斗皮卡:印第安纳州山毛榉树林 目的地:印第安纳州特雷豪特 星期日, 八月 04, 2013 漏斗皮卡:琼斯伯勒,阿肯色州 目的地:战斗克里克,密歇根州 现场底部皮卡:琼斯伯勒,阿肯色州 目的地:密苏里州泰勒

现在,由于格式化我无法显示所有空格,例如在 DUMP 和 Pick 之间,大约有 3 个选项卡的空格。

所以我想要的是将包含日期的块放入数组中。使用 ^(?:Mon|Tues|Wednes|Thurs|Fri|Satur|Sun)day,(.*) 只给我带有日期的行,并使用 ((.|n)*) 而不是 (.*) 选择所有日期。我怎样才能使这个正则表达式从日期一直选择到最后一个条目,然后假设有 n 个条目出现一个新日期。

您可以使用以下代码:

$s = <<< EOF
Saturday, August 03, 2013
DUMP Pickup: LITTLE ROCK, AR
Dest: CALDWELL, TX
HOPPER Pickup: BEECH GROVE, IN
Dest: TERRE HAUTE, IN
Sunday, August 04, 2013
HOPPER Pickup: JONESBORO, AR
Dest: BATTLE CREEK, MI
LIVE BOTTOM Pickup: JONESBORO, AR
Dest: TAYLOR, MO
EOF;
if (preg_match_all(
  "~(?:Mon|Tues|Wednes|Thurs|Fri|Satur|Sun)day,(.+?)(?=n(?:Mon|Tues|Wednes|Thurs|Fri|Satur|Sun)day,|$)~s", $s, $arr))
   var_dump($arr[0]);

输出

array(2) {
  [0]=>
  string(126) "Saturday, August 03, 2013
DUMP Pickup: LITTLE ROCK, AR
Dest: CALDWELL, TX
HOPPER Pickup: BEECH GROVE, IN
Dest: TERRE HAUTE, IN"
  [1]=>
  string(126) "Sunday, August 04, 2013
HOPPER Pickup: JONESBORO, AR
Dest: BATTLE CREEK, MI
LIVE BOTTOM Pickup: JONESBORO, AR
Dest: TAYLOR, MO"
}

使用正则表达式,我总是先在这里玩:http://regexpal.com/

然后你需要使用 - 数组preg_match

preg_match('/(^w+day).+(d{1,2})/', $str, $matches);
print_r($matches);

它应该打印你的数组:

 Saturday and dates ...

每个相关的块都是它自己的数组,日期始终为 0,其他块也是可预测的。 一点 strstr() etc 或 explode() 可以从每一行得到类似的结果。

$lines = file($filename);
$chunks = array_chunk($lines, 5);
print_r($chunks);
Array
(
    [0] => Array
        (
            [0] => Saturday, August 03, 2013
            [1] => DUMP                   Pickup:   LITTLE ROCK, AR
            [2] => Dest:  CALDWELL, TX
            [3] => HOPPER                Pickup:   BEECH GROVE, IN
            [4] => Dest:  TERRE HAUTE, IN
        )
    [1] => Array
        (
            [0] => Sunday, August 04, 2013
            [1] => HOPPER                Pickup:   JONESBORO, AR
            [2] => Dest:  BATTLE CREEK, MI
            [3] => LIVE BOTTOM         Pickup:   JONESBORO, AR
            [4] => Dest:  TAYLOR, MO
        )
)

我同意应该写一个解析器,我很无聊,所以这就是我想出的:

function parse_( $str ) {
    $data = array();
    foreach( explode( "n", $str ) as $line ) {
        if ( strpos( $line, ':' ) === false ) {
            $date = $line;
        }
        elseif( stripos( $line, 'pickup:' ) ) {
            $string = $line;
        }
        else {
            $data[$date][] = $string . ' -> ' . explode( ': ', $line )[1];
        }
    }
    return $data;
}
print_r( parse_( $str ) );

输出

Array
(
    [Saturday, August 03, 2013] => Array
        (
            [0] => DUMP Pickup: LITTLE ROCK, AR -> CALDWELL, TX
            [1] => HOPPER Pickup: BEECH GROVE, IN -> TERRE HAUTE, IN
        )
    [Sunday, August 04, 2013] => Array
        (
            [0] => HOPPER Pickup: JONESBORO, AR -> BATTLE CREEK, MI
            [1] => LIVE BOTTOM Pickup: JONESBORO, AR -> TAYLOR, MO
        )
)

使用 strpos 循环每行,以确定它是哪种"类型"的行。

如果您使用的是 php <5.4(我相信),则必须更改最后一个其他内容并添加第一步来分解数据。

http://ideone.com/heb4ty

最新更新