Also please keep in mind that for other companies, the street name or city can have more then one word, like "New York", so an easy solution to divide the data based on space between words doesn't work for me.

As you have stated that postal code will be in 99-999 format and assuming the street number (+ any flat identification) will always start with a number, you can use a preg_match to parse the address string: