0

I created a html form in which you can enter your street address in a single string. How can I extract the street number, street name and street type (crescent, road, street etc) in PHP? I am not sure of the length of the string they will enter and it might not extract the correct information.

Please kindly help as I am new in coding in PHP.

Here is my code below:

$address = $_POST["address"];

echo "Your address is: $address <br>";

$addressSubstring = substr($address,0 , 15);

echo "Address: $addressSubstring <br>";

$strNumber = substr($addressSubstring, 0, 2);

$strName = substr($addressSubstring, 2, 8);

$strType = substr($addressSubstring, 8, 15);

echo "Your street number is: $strNumber <br>";
echo "Your street name is: $strName <br>";
echo "Your street type is: $strType <br>"
mickmackusa
  • 37,596
  • 11
  • 75
  • 105
Faye
  • 45
  • 8
  • Can you provide a samle of what's being passed to `$address`? Generally though, it's easier if you have separate inputs for this, then you don't have to go through all sorts of validation and checking, as the user can input just part of what you're expecting. – Qirel Apr 22 '17 at 11:28
  • Samples of address please ... – Hossam Apr 22 '17 at 11:29
  • Hi @Qirel the address examples are: 43 Willow Street, 35 Hanover Crescent & 52 Longford Road. – Faye Apr 22 '17 at 11:44
  • Hi @HossamMagdy, please see reply to Qirel regarding examples of addresses. Thank you – Faye Apr 22 '17 at 12:01

2 Answers2

1

You can't rely on getting substrings in fixed positions and lengths like in your code as they will change each time.

Without using any API or AI, the best you can do is create an array with road types (and their abbreviations) and check if any of that words is in the string.

For that you can use strpos for each word or regular expressions matching.

Then you can remove that word from the string, and get the position of the first space using strpos again. Then use that position to get the substring before the space (street number) and the substring after the space (street name).

0

Keeping in mind that road types are "crescent|road|street":

Using regular expressions can solve the issue:

<?php
$address = '43 Willow Street'; // $_POST["address"] or '35 Hanover Crescent & 52 Longford Road';

preg_match_all("/(\d+)(.+?)(crescent|road|street)/i", $example, $out_arr);

// $no_of_addresses_found = count($out_arr[0]); // in case of future improvements
$strNumber = $out_arr[1][0];     // 43
$strName = trim($out_arr[2][0]); // Willow
$strType = $out_arr[3][0];       // Street

echo "Your street number is: $strNumber <br>";
echo "Your street name is: $strName <br>";
echo "Your street type is: $strType <br>"
Hossam
  • 1,105
  • 8
  • 19