好的,我们开始吧。我用的是x
标志以使正则表达式更具可读性并能够对其进行注释。
从 @EboMike 发布的规范来看,每个字段都有最大长度,并以^
如果它比该长度短。该名称是一个复合字段,使用$
作为姓氏、名字、中间名和后缀之间的分隔符。地址也是如此,它使用$
如果地址有多行。
$licenses = array(
'%CAMISSION HILLSSMITH$JOHN$JIM$JR^1147 SOMESTREET^?',
'%CALOS ANGELES^DOE$JOHN$CARL^14324 MAIN ST APT 5^?'
);
foreach ($licenses as $license) {
preg_match(
'@
^%
(.{2}) # State, 2 chars
([^^]{0,12}.) # City, 13 chars, delimited by ^
([^^]{0,34}.) # Name, 35 chars, delimited by ^
([^^]{0,28}.) # Address, 29 chars, delimited by ^
\?$
@x',
$license,
$fields
);
$state = $fields[1];
$city = rtrim($fields[2], '^');
$name = explode('$', rtrim($fields[3], '^'));
$address = explode('$', rtrim($fields[4], '^'));
echo "$license\n";
echo "STATE: "; print_r($state); echo "\n";
echo "CITY: "; print_r($city); echo "\n";
echo "NAME: "; print_r($name);
echo "ADDRESS: "; print_r($address);
echo "\n";
}
Output:
CAMISSION HILLSSMITH$JOHN$JIM$JR^1147 SOMESTREET^
STATE: CA
CITY: MISSION HILLS
NAME: Array
(
[0] => SMITH
[1] => JOHN
[2] => JIM
[3] => JR
)
ADDRESS: Array
(
[0] => 1147 SOMESTREET
)
CALOS ANGELES^DOE$JOHN$CARL^14324 MAIN ST APT 5^
STATE: CA
CITY: LOS ANGELES
NAME: Array
(
[0] => DOE
[1] => JOHN
[2] => CARL
)
ADDRESS: Array
(
[0] => 14324 MAIN ST APT 5
)