1

私は正規表現を書く際にいくつかの問題に遭遇しており (私はそれが得意ではありません)、次のステップがどうあるべきかを理解していません。私がやろうとしているのは、PHP を使用していくつかのテキスト ブロックを配列に抽出することです。テキストは次のようになります。

2013年8月3日土曜日  
DUMP ピックアップ: リトルロック、AR  
宛先: CALDWELL, TX   
ホッパー ピックアップ: BEECH GROVE, IN  
宛先: TERRE HAUTE, IN  
2013年8月4日日曜日  
HOPPER ピックアップ: JONESBORO, AR  
目的地: バトル クリーク, MI  
LIVE BOTTOM ピックアップ: JONESBORO, AR  
宛先: テイラー、ミズーリ州

書式設定ではすべてのスペースを表示できないため、たとえば DUMP と Pickup の間には約 3 タブ分のスペースがあります。

だから私が欲しいのは、日付を含むブロックを配列に入れることです。を使用^(?:Mon|Tues|Wednes|Thurs|Fri|Satur|Sun)day,(.*)すると、日付が含まれる行だけが表示され、すべてを選択する((.|\n)*)代わりに使用します。(.*)n 個のエントリを想定して、新しい日付が表示される前に、この正規表現を日付から最後のエントリまで選択するにはどうすればよいですか。

4

4 に答える 4

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 に答える
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 に答える