Miscellaneous > Programming & Networking

Address Parsing

(1/2) > >>

worker201:
I've been trying to write an address parsing routine in PHP.  The user is prompted to input a street address.  In my area, the address is of the form:
number prefix street type (example: 101 N 37th Ave)
or
number street type suffix (example: 101 37th St NW)

Of course, the user might simply put in 101 14th, but that's okay, I think I've covered that.  What I'm not sure about is how to deal with multi-word streetnames.  What if the address is 101 SW Happy Morning Bluebird Dr?

Here's the code I've got so far, which works great for single-word streetnames, and even deals with incomplete addresses.  Am I going about this in the wrong way?  Got any ideas how I can improve my algorithm?

The address parts will eventually be used to search a street database.


--- Code: ---<?php
$address = $_POST['address'];
$parts_array = sscanf($address, "%d %s %s %s");
if ($parts_array[0] > 0) {
$number = $parts_array[0];
//echo "Number is $number <br>";
}
else {
echo "This does not seem to be a valid address";
exit;
}
$fixes = array("NW", "NE", "SW", "SE", "N", "S", "E", "W");
if (in_array($parts_array[1], $fixes)) {
$prefix = $parts_array[1];
//echo "Prefix is $prefix <br>";
$name = strtoupper($parts_array[2]);
//echo "Name is $name <br>";
if ($parts_array[3] != NULL) {
$type = strtoupper($parts_array[3]);
//echo "Type is $type <br>";
}
}
elseif (in_array($parts_array[3], $fixes)) {
$name = strtoupper($parts_array[1]);
//echo "Name is $name <br>";
$type = strtoupper($parts_array[2]);
//echo "Type is $type <br>";
$suffix = $parts_array[3];
//echo "Suffix is $suffix <br>";
}
else {
$street = strtoupper($parts_array[1]);
//echo "Street is $street <br>";
if ($parts_array[2] != NULL) {
$type = strtoupper($parts_array[2]);
//echo "Type is $type <br>";
}
}
?>
--- End code ---

Calum:
can you make it recognise every string that might be considered a "type" (like with your array for the prefixes and suffixes) and then assume that everything before it (with spaces included) must be the "street"?

worker201:
That might work, assuming every address has a type - I'll have to check on that.  I've already made a list of all the types that appear in the database, as part of another aspect of the project, so it wouldn't be too difficult to implement.  Thanks for the suggestion.

worker201:
Finally got this working.  Tried with a bunch of different test addresses, seems to work.  If you entered "123921 kdjslf skdsls", this would sort it just fine, but the program as a whole would fail, hard.


--- Code: ---<?php
$address = $_POST['address'];
$parts_array = explode(" ", $address);
if ($parts_array[0] > 0) { // the first piece of the address is a number
$number = $parts_array[0];
//echo "Number is $number <br>";
} else { // user has provided an address without a number
echo "This does not seem to be a valid address";
exit;
}
$fixes = array("NW", "NE", "SW", "SE", "N", "S", "E", "W");
$types = array("ACRD", "ALY", "AVE", "BLVD", "BR", "CIR", "CRST", "CT", "DR", "FRWY", "HWY", 
      "KY", "LN", "LOOP", "PKWY", "PL", "PT", "RD", "ST", "TER", "TRL", "WALK", "WAY");
for ($i=1; $i < count($parts_array); $i++) {
  $parts_array[$i] = strtoupper($parts_array[$i]);
  if (in_array($parts_array[$i], $fixes)) {
    if ($i == 1) {
      $prefix = $parts_array[$i];
    } else {
      $suffix = $parts_array[$i];
    }
  } elseif (in_array($parts_array[$i], $types)) {
    $type = $parts_array[$i];
  } else {
    if (isset($name)) {
      $name = $name . " " . $parts_array[$i];
    } else {
    $name = $parts_array[$i];
    }
  }
}
?>
--- End code ---

Calum:
well done. by the way i know nothing about scripting or programming so the fact my suggestion even made sense is a bonus!

Navigation

[0] Message Index

[#] Next page

Go to full version