PHP Developer ForumHier habt ihr die Möglichkeit, eure Skriptprobleme mit anderen Anwendern zu diskutieren. Seid so fair und beantwortet auch Fragen von anderen Anwendern. Dieses Forum ist sowohl für ANFÄNGER als auch für PHP-Profis! Fragen zu Laravel, YII oder anderen PHP-Frameworks.
ich habe eine Datenbank, in der Straße und Hausnummer in einem Feld stehen. Diese sollen aber nun getrennt werden.
Will mein Glück mit strpos() versuchen, aber hier kann ich ja nur explizit ein Zeichen angeben. Es müsste also die Position des ersten numerischen Vorkommens abgefragt werden. Gibt es hierzu irgend eine strpos-variante die RegExp versteht oder wie könnte man das lösen?
Alle Ziffern prüfen, in ein Array ziehen und dann nach Position sortieren?
Gibt's ne elegantere Lösung?
Ein Problem gibt es jedoch mit ausländischen Adressen, da diese oftmals die Hausnummer vorne stehen haben.
Z.B. "123 Main Street".
Dafür müsste dann noch ne Abfrage rein wenn der String Numerisch beginnt, dass dann die Nummer am Anfang abgegriffen wird.
Problematisch wird es aber dann, wenn er hier ggf. auch Alphanumerische Hausnumern gibt.
Z.B. "123 B Main Street".
aber du hast prinzipiell nen falschen Datenbank Aufbau, wenn alles in einer Zelle steht!
mfg streuner
__________________
Erst wenn der letzte FTP Server kostenpflichtig, der letzte GNU-Sourcecode verkauft, der letzte Algorithmus patentiert,
der letzte Netzknoten verkommerzialisert ist, werdet Ihr merken, dass Geld nicht von alleine programmiert.
"Diese Software verdient die 3 großen GGG: --- Gesehen --- Gelacht --- Gelöscht ---"
Danke, aber nein, substr() suche ich nicht.
substr() auf sql-basis löst auch nicht das Problem zum Ermitteln der ersten numerischen Stelle.
Ausserdem geht es hier gar nicht um SQL speziell!
Die Daten werden mir als Excel-Liste zur Verfügung gestellt und ich muss sie für eine Anwendung säubern.
Ich importiere die zwar in eine SQL-Datenbank, aber dass ist nicht der Kern der Problems.
Haußnummer und Straßennamen automatisiert zu trennen ist höchst komplex und aufwändig. Beispiele von gültigen Straßennamen/Hausnummern:
Straße des 17. Juni 16 (Straße: Straße des 17. Juni, Hausnummer: 16)
Musterstraße 22 TOP 4 (Straße: Musterstraße, Hausnummer: 22 TOP 4)
12. Februar-Platz 1A (Straße: 12. Februar-Platz, Hausnummer: 1A)
164er Ring 3 (Straße: 164er Ring, Hausnummer: 3)
Und das sind jetzt nur mal deutschsprachige Adressen.
Ich würde die einfachen Adressen (also [A-Za-z]+\s[0-9]+) automatisiert verarbeiten und beim Rest muss halt jemand per Hand nacharbeiten. So hält man den Aufwand in Grenzen.
...
Musterstraße 22 TOP 4 (Straße: Musterstraße, Hausnummer: 22 TOP 4)
...
Interessant, kann man irgendwo nachlesen, wo diese Notation eingesetzt wird und was sie bedeutet?
Zitat:
Zitat von andik2000
Hallo zusammen,
ich habe eine Datenbank, in der Straße und Hausnummer in einem Feld stehen. Diese sollen aber nun getrennt werden.
Die wichtigste Frage dabei ist: WARUM trennen?
Hausnummern in Adressangaben sind sehr fragile Objekte. Auch wenn du glaubst, schon alle Variationen gesehen zu haben, es gibt immer welche, die du noch nicht gesehen hast.
Zitat:
Es müsste also die Position des ersten numerischen Vorkommens abgefragt werden.
Nein: Wie h3ll schon aufführte, gibt es Straßennamen, die selbst Ziffern enthalten.
* Darüber hinaus gibt es Anschriften ganz ohne Hausnummern.
* Es gibt kombinierte Hausnummern (08/15) und Von-Bis-Hausnummern (23-42).
* Es gibt Adressangaben, da folgen auf die Hausnummer weitere Angaben (Treppenhaus-, Stockwerksnummer, e.t.c.)
* ...
Zitat:
Gibt es hierzu irgend eine strpos-variante die RegExp versteht ...?
Die strpos()-"Variante", die reguläre Ausdrücke versteht, heißt preg_match($pcre, $haystack, $hits, PREG_OFFSET_CAPTURE). Allerdings brauchst du bei der Benutzung von preg_match() in deinem Fall keine Positionsangaben mehr. Wenn du den richtigen Regex benutzt, liefert dir $hits alle gewünschten Bestandteile als Subpatterns ins Haus[0].
Zitat:
Zitat von andik2000
Also ich habe mir jetzt mal was zusammengebastelt, was erst mal funktioniert:
Wie kommt man auf so ein umständliches Konstrukt? Wenn du schon reguläre Ausdrücke benutzt, dann frage nicht in jede Ziffer einzeln ab. Die Dinger sind sehr leistungsfähig und können das auch allein.
Falls nicht, hat die angegebene Adresse keine Hausnummer oder wurde durch den Regex nicht erfasst (dann verschicke halt keine Post nach Mannheim ).
*update*
Hier noch das verwendete (und sicher unvollständige) Test-Array:
PHP-Code:
$tests = array (
// works
'Große Heimstraße 2',
'Große Heimstraße 2½',
'Stockumer Straße 398 – 398½ - 402',
'Mariahilfer Straße 38–48',
'Irgendwo in Berlin linear 08-15',
'Irgendwo in Berlin zick/zack 08/15',
'7. Straße des 1. April 5',
Bevor jetzt also noch wer auf die Idee kommt, eine ausgeklügelte strr?pos()-substr()-Logik zu posten: Erstmal testen, ob die wenigstens mit dieser Liste zurechtkommt.
*end_update*
Zitat:
Ein Problem gibt es jedoch mit ausländischen Adressen, da diese oftmals die Hausnummer vorne stehen haben.
Z.B. "123 Main Street".
Musst du Adressen außerhalb des deutschen Sprachraums erfassen? Falls ja, kommen wir wieder zu meiner ersten Frage: Warum (zum Geier) willst du die Hausnummer abtrennen?
Zitat:
Dafür müsste dann noch ne Abfrage rein wenn der String Numerisch beginnt, dass dann die Nummer am Anfang abgegriffen wird.
Ja und du brauchst eine künstliche Intelligenz, die (wie ein Mensch auf den ersten Blick) erkennt, ob es sich jetzt um eine Adresse mit Hausnummer vorn oder hinten handelt oder ob die Zifferngruppe zum Straßennamen gehört. Prinzipiell könnte man natürlich Fallunterscheidungen je nach Land machen. ... und dabei Belgien nicht vergessen, wo schon mal bei zweisprachig angegebenen Adressen die Hausnummer in der Mitte steht ...
Zitat:
Problematisch wird es aber dann, wenn er hier ggf. auch Alphanumerische Hausnumern gibt.
Z.B. "123 B Main Street".
Das wäre für einen Regex das geringste Problem, weil es für so etwas Zeichenklassen gibt.
Zitat:
Gibt's ne elegantere Lösung?
Ja, die Gültigkeit der Adresse bei einem entsprechenden Dienstleister abfragen. Am besten bei dem, der auch die Päckchen und Briefe zustellt, die dein Brötchengeber verschickt. Denn so ein Dienstleister (im Volkmund auch "Post" genannt) hat jahrhundertelange Erfahrung im Umgang mit Adressangaben.
Interessant, kann man irgendwo nachlesen, wo diese Notation eingesetzt wird und was sie bedeutet?
Zitat:
Seit den 1990er Jahren verbreitet sich in Österreich für Wohnungs- und Türnummern auch die umgangssprachliche Bezeichnung Top (von Topos, griechisch für "Ort").
Straße und Hausnummer in Deutschland sind ja "normalerweise" durch ein Leerzeichen getrennt.
Nur, wenn die Daten "ordentlich" erfasst wurden. Wer definiert, was "normal" ist? Bei "Google-Recherchen" zu dem Thema bin ich auf ein Supportforum irgendeiner E-Commerce-Software gestoßen. Da wünschten sich die Anwender getrennte Eingabefelder für Straße und Adresse. Sie waren mit Kunden konfrontiert, die entweder die Hausnummer ganz weggelassen oder ein trennendes Leerzeichen vergessen hatten. Deswegen habe ich in meiner oben geposteten Lösung den letzteren Fall berücksichtigt.
Man könnte natürlich auch direkt bei der Eingabe durch den Benutzer auf das Vorhandensein einer Nummer prüfen und im Fehlerfall die Korrektur anbieten und darauf hinweisen, dass man ansonsten automatisch die 1 als Hausnummer in die Datenbank aufnimmt. Das erscheint mir sinnvoller, als nachträglich versuchen, zu erraten, was denn gemeint sein könnte.
Zitat:
Mittels strrpos($adresse, ' ') kann man doch das letzte Leerzeichen ermitteln, um dann mit
Das Gleiche tut ein einfach(st)er Regex: '/\S+\z/'. Und er scheitert genauso wie deine aufwendigere Logik, wenn nach der Hausnummer noch etwas kommt, wie bspw. "Bahnhofstraße 7 a".
Zitat:
Noch eine Kuriosität: In Bayern ("eigenäugig" vor Jahren gesehen) gibt's noch Hausnummern mit Bruchzahlen, siehe Anhang.
Schönes Foto. Wikipedia suggeriert, dass solche Nummern in den letzten Jahren "wegrationalisiert" wurden. Trotzdem hab ich sie vorsichtshalber in meinen obigen Regex aufgenommen. '/\pN/u' findet mehr als nur die ASCII-Ziffern von 0 bis 9. Sieht man ja auch an meinem Beispiel "Große Heimstraße 2½" ...
Das ändert aber alles nichts, wenn der Threaderöffner auch Adressen außerhalb des deutschen Sprachraums verarbeiten will. Dann wird die Sache komplizierter.
Zitat:
Na denn, auf zum fröhlichen reg_expr-entwickeln
Ich denke, ein RegEx wird da nicht reichen. Man benötigt einen richtigen Parser, der auch die anderen Adress-Felder berücksichtigt, um Länder-spezifische Notationen richtig zuordnen zu können. Wenn man das wirklich vollautomatisch machen möchte. Wenn man überhaupt die Hausnummer abtrennen will. Mir ist immer noch nicht klar, warum man das tun sollte ...
Man könnte natürlich auch direkt bei der Eingabe durch den Benutzer auf das Vorhandensein einer Nummer prüfen und im Fehlerfall die Korrektur anbieten und darauf hinweisen, dass man ansonsten automatisch die 1 als Hausnummer in die Datenbank aufnimmt.
Wäre es da nicht einfacher ein separates Eingabefeld für die Hausnummer anzubieten?
Prinzipiell ja. Nur hast du dann wieder das Problem, dass du die Adresse anschließend richtig zusammensetzen musst: Wenn die Nummer mal am Ende (AT|CH|DE), am Anfang (UK|US), in der Mitte (BE) oder am Anfang oder am Ende eingefügt werden muss, wird das wieder lustig. Und wenn meine Adresse "Dunkeldorf, Hauptstraße" lautet, was gebe ich dann in das Feld ein?
Und dann wäre da noch die Validierung des Hausnummern-Feldes: Ziffern reichen nicht, wie wir bereits gesehen haben. Dazu kämen noch Adresszusätze und User, die nicht wissen, wo sie was reinschreiben sollen, wie in dem oben verlinkten Support-Thread schön beschrieben. Dann nehme ich lieber die komplette Adresse entgegen und hoffe, dass der von mir beauftragte Post-Dienstleister dazu auch die richtige Wohnungstür findet.
Hinzu kommt noch die Anwenderfreundlichkeit: Arbeitest du dich lieber durch ein Formular mit unzähligen Einzelfeldern, oder sind dir "Freiform"-Eingaben lieber? Ich kann es nicht ausstehen, bspw. mein Geburtsdatum in drei Einzelteilen eingeben zu müssen. Mein Billig-Smartphone kann mir zwar auf Zuruf den Weg zum Bäcker zeigen, aber wenn ich irgendwo meine Postadresse hinterlassen soll, muss ich die Hausnummer in ein separates Feld eintragen?
wir haben eine API welche Adressen im Internet überprüft, korrigiert und das ergebnis in einzelnen Werten wieder zurückgibt.
Als Showcase haben wir ein Excel Add-In damit gebaut. Aber das ganze gibt es auch als API.
Namen einem Geschlecht zuordnen kann man (nicht nur) per PHP schon länger -- kostenlos mit zusätzlicher Funktionalität, ohne nötige Netzwerkverbindung und auf allen gängigen Betriebssystemen (unter Windows genügt eine DLL, keine Setup.exe nötig).
die Korrektur vom International Address Parser funktioniert aber gar nicht gut. Selbst geringe Abweichungen vom echten Namen wurden bei unseren Tests nicht erkannt. z.B. Vogelwiederstraße anstatt Vogelweiderstraße.
Bei METHIS werden sogar solche Adressen erkannt und korrigiert:
5020/VOGELWEIDERSTR./44/5
127 CalledeAtocha Madrad
RUEDERIVOLI184PARIS
NørreVoldgade82Kopenhagn
FleetStreet152London (VIP)
VIA NOMENTANA 1141 Rom
Getreidegasse_26_Salzburg
Rubens\1\04317?
Bahnhofplatz-5-Zürich!!!
Und bezüglich Geschlechtererkennung - ja gibt es auch kostenlos, aber wir reden hier halt nicht von 40.000 Namen, sondern von über 800.000 Namen aus über 140 Ländern.
Ich wollte lediglich Alternativen aufzeigen. Ob die besser oder schlechter sind, muss der an Adress-Prüfungen interessierte Webentwickler schon selbst herausfinden ...
Was mir an eurem Service fehlen würde, ist eine PHP-Anbindung oder wenigstens ein paar PHP-Source-Code-Beispiele zur API-Nutzung. Schließlich sind wir hier in einem PHP-Forum und keinem Excel-User-Board.
Zitat:
Zitat von METHIS
...
Und bezüglich Geschlechtererkennung - ja gibt es auch kostenlos, aber wir reden hier halt nicht von 40.000 Namen, sondern von über 800.000 Namen aus über 140 Ländern.
Die RIGID-FLEX-Technologie Die sogenannte "Flexible Elektronik" , oftmals auch als "Flexible Schaltungen" bezeichnet, ist eine zeitgemäße Technologie zum Montieren von elektronischen Schaltungen.
WeltExplorer v1.0 ist ein Dateimanager zum Browsen und Operieren im Dateisystem. Bei installiertem cURL können Ordner und Dateien zu entfernten FTP-Servern hochgeladen bzw. von diesen heruntergeladen werden, etwa zum Erstellen von Backups oder Mirrorsites
> Job Site Pro - web-basiertes Programm, auf PHP/MySQL für Erstellung der funktionellen Job Board Site gebaut. Das hat erweitertes Management-System für Arbeitssuchenden und Arbeitgeber und kann für bestimmte Länder, Regionen oder einfach generelle Job Si