1

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

2013 年 8 月 3 日星期六  
DUMP 皮卡:LITTLE ROCK,AR  
目的地:德克萨斯州考德威尔   
HOPPER Pickup: BEECH GROVE, IN  
目的地: TERRE HAUTE, IN  
2013 年 8 月 4 日,星期日  
料斗皮卡:琼斯伯勒,AR  
目的地:密歇根州巴特尔克里克  
LIVE BOTTOM 拾音器:JONESBORO, AR  
目的地: 泰勒,密苏里

现在因为格式化我不能显示所有的空格,例如在 DUMP 和 Pickup 之间有大约 3 个制表符的空格。

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

4

4 回答 4

0

您可以使用以下代码:

$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"
}
于 2013-10-15T17:01:53.490 回答
0

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

然后你需要使用 - 数组 preg_match

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

print_r($matches);

它应该打印你的数组:

 Saturday and dates ...
于 2013-10-15T17:03:31.850 回答
0

每个相关块都是它自己的数组,日期始终为 0,其他块也是可预测的。一点 strstr() 等或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
        )

)
于 2013-10-15T17:03:36.797 回答
0

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

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(我相信),您将不得不更改最后一个 else 并添加爆炸数据的第一步。

http://ideone.com/heb4ty

于 2013-10-15T17:18:35.203 回答