我在编写正则表达式时遇到了一些麻烦(我不精通它),并且还没有弄清楚我的下一步应该是什么。我正在尝试做的是使用 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