PHP: Straßenname und Hausnummer mit PHP parsen

So können Sie mit PHP aus einer Adresse den Straßenname und die Hausnummer extrahieren.

In einem aktuellen Projekt muss ich aus einer zusammengesetzten Adresse bzw. zusammengesetzte Adress-Zeile mit Straße und Hausnummer, beide Werte extrahieren. Insbesondere bei der Vielzahl an Möglichkeiten in Deutschland und der Kreativität von Kundeneingaben keine einfache Aufgabe.

Nach einer kurzen Recherche im Netzt bin ich dabei auf einen kleinen regulären Ausdruck gestoßen, der hervorragend funktioniert. Die Idee dahinter ist, dass solange der Straßenname kommt, bis irgendeine Zahl losgeht. Das sollte in 99% der Fälle genauso klappen. Ich habe das ganze dann noch in eine kleine Funktion gekapselt um strukturierte Wiedergabewerte zu bekommen.

function parse_street_number($address) {

    $match = array();

    preg_match('/^([^\d]*[^\d\s]) *(\d.*)$/', $address, $match);

    if (count($match) == 0) return null;

    $street = new StdClass();

    $street->street = $match[1];
    $street->street_number = $match[2];

    return $street;

}

Man übergibt der Funktion parse_street_number einfach die zusammengesetzte Adresszeile mit Straße und Hausnummer und bekommt dann entweder null zurück oder eine Objekt mit den Attributen street und street_number. Wenn null zurückkommt, dann wurde keine Hausnummer gefunden.

Folgender kleiner Test:

$test_addresses = array(
	'hocksteinweg11',
	'hocksteinweg11a',
	'Hocksteinweg 11',
	'Geschwister-Scholl-Straße 1',
	'Birken Weg'
);


foreach ($test_addresses as $nr => $address) {
	
	$street = parse_street_number($address);
	
	var_dump($street);
	
}

Erzeugt dann folgende Ausgabe:

object(stdClass)#1 (2) {
  ["street"]=>
  string(12) "hocksteinweg"
  ["street_number"]=>
  string(2) "11"
}
object(stdClass)#2 (2) {
  ["street"]=>
  string(12) "hocksteinweg"
  ["street_number"]=>
  string(3) "11a"
}
object(stdClass)#1 (2) {
  ["street"]=>
  string(12) "Hocksteinweg"
  ["street_number"]=>
  string(2) "11"
}
object(stdClass)#2 (2) {
  ["street"]=>
  string(26) "Geschwister-Scholl-Straße"
  ["street_number"]=>
  string(1) "1"
}
NULL

Ich hoffe, dass Sie die Funktion in Ihren Projekten nutzen können. Viel Spaß.


0 0 0


Diskussion

avatar placeholder
29. Jan. 2015 von Alexander

Dankeschön. Habe es etwas modifiziert, so dass die Straße genommen wird wenn es keine Hausnummer gibt

protected function parse_street_number($address) {

$match = array();

preg_match(‘/^([^\d]*[^\d\s]) *(\d.*)$/’, $address, $match);

$street = new StdClass();

if (count($match) == 0) {
$street->street = $address;
$street->street_number = ”;
} else {
$street->street = $match[1];
$street->street_number = $match[2];
}

return $street;

}

avatar placeholder
28. Juni 2017 von Stefan

Leider passt das nciht für Adressen in Mannheim
z.B. A1, 15; C7, 18 oder L10, 5
https://de.wikipedia.org/wiki/Quadratestadt#Hausnummern_in_den_Quadraten

^(\w *\d{1,2}|[^\d]*[^\d\s])[, ]*(\d.*)$

avatar placeholder
8. Okt. 2020 von Alex

Ich würde eine einfachere/universelle Lösung anbieten, die auch für z.B. Österreichischen Hausnummern like 56/3/4 gilt

^(.*) (\w\d+.*)$

Mitdiskutieren

*