If there is, I certainly don't see it. We are doing magnetic stripe reads off of driver's licenses. The data does not seem to be consistent. The standard that the driver's licenses should follow sets limits on the length that any one field can have. The part that I can't wrap my head around is how to parse this data.
For example, a field may allow 13 total characters but only 8 are used. In this case, there will always be a caret delimiter ending that portion of the string. However, and here is the tricky part, if a field is exactly 13 (of the 13 allowable), there is no end caret delimiter and no right padding. All of the data just runs together.
Here are two sample strings.
%CAMISSION HILLSSMITH$JOHN$JIM$JR^1147 SOMESTREET^?
%CALOS ANGELES^DOE$JOHN$CARL^14324 MAIN ST APT 5^?
Using PHP, how might I do this? I'd truly appreciate a hand on this. I'm really stumped.
Okay, here we go. I used the x
flag to make the regex more readable and be able to comment it.
From the spec @EboMike posted, each field has a maximum length and is terminated by ^
if it is shorter than that length. The name is a composite field using $
as a separator between family name, first name, middle name, and suffix. Same goes for the address, which uses $
if the address has multiple lines.
$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
)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With