|
|
KrickelD
Hallo Leute,
derzeit bastel ich an einer Funktion, die Telefonnummern in das internationale Format bringen soll, komme aber nicht auf den richtigen Weg...
0160 1234567
0160-1234567
+49160 1234567
00491601234567
soll alles zur langen schreibweise werden:
00491601234567
hat jemand von euch eine nette funktion im ärmel?
TrioxX
Wenn überhaupt, kannst du das Ganze höchstens mit preg prüfen und ggf. ins richtige Format ersetzen. Eine andere Lösung ist mir nicht bekannt.
Oder du prüfst auf ein Vorkommnis von 0049 und ersetzt im false Falle einfach...
KrickelD
da liegt mein problem, ich möchte es unabhängig von 49 (also der ländervorwahl) haben...
schritt 1: alle zeichen außer ziffern und + entfernen
schritt 2: wenn es mit + beginnt dann durch 00 ersetzen
schritt 3: wenn es mit 0 beginnt dann durch 0049 ersetzten
dann müsste ich doch alle fälle berücksichtigt haben, oder?
TrioxX
Das wiederspricht sich ja dann im Ergebnis:
| Zitat: |
| schritt 1: alle zeichen außer ziffern und + entfernen |
Das dürfte ja kein Problem sein.
| Zitat: |
| schritt 2: wenn es mit + beginnt dann durch 00 ersetzen |
Funktioniert nicht mehr, wenn Schritt 1 angewendet wurde
| Zitat: |
| schritt 3: wenn es mit 0 beginnt dann durch 0049 ersetzten |
Funktioniert nicht mehr, wenn Schritt 2 angewendet wurde
Das Ganze in 3 Schritten zu machen, halte ich sowieso für unnötig. Entferne einfach alle nicht numerischen Zeichen aus dem Nummernstring und hau direkt nen Regex ala
| code: |
1:
|
^\(\d{1,2}(\s\d{1,2}){1,2}\)\s(\d{1,2}(\s\d{1,2}){1,2})((-(\d{1,4})){0,1})$ |
|
drüber (DIN 5008 - http://de.wikipedia.org/wiki/Rufnummer#Schreibweisen)
Ausländische Nummern werden etwas schwieriger, da z.B. in der Schweiz meiens Wissens nach 7-Stellige Rufnummern verwendet werden.
Die Schwierigkeit besteht also nicht unbedingt in der Formatierung, sondern im Abgleich da du ja nicht weißt, ob es sich um eine deutsche Rufnummer, oder um eine ausländische handelt. Oder?
Am wichtigsten ist auf jeden Fall, alle Rufnummern erst einmal einheitlich auf ein numerisches Standard zu bringen.
Du könntest so z.b. auch einfach die ersten beiden Zahlen einer Nummer prüfen und dann falls nötig verändern (da ja deiner Suche nach sämtliche Nummern die nicht 00 entsprechen, korrigiert werden müssen).
KrickelD
so viel arbeit, danke dafür
zu schritt 1: Außer, dementsprechend bleiben nur ziffern UND + stehen
ländervorwahlen sind immer zweistellig, die gesamtlänge ist eigentlich egal.
was hälst du davon?
| php: |
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
|
<?
$nr = array("0160 1234567", "0160 123 4567", "00491601234567", "+491601234567", "+49160 123 4567", "0160-1234567", "+47166 123 4567");
echo "________eingabe______________wird_zu____";
foreach ($nr as $val) {
echo "\n_____".str_pad($val,20,"_",STR_PAD_RIGHT).clean_number($val);
}
function clean_number($nr) {
if (!empty($nr)) {
$temp = preg_replace('/[^0-9,\+]/','',$nr);
if (substr($temp,0,1)=="0" && substr($temp,1,1)!="0") {
$temp = "0049".substr($temp,1);
} else $temp = str_replace("+", "00", $temp);
return $temp;
} else return "";
}
?> |
|
liefert
| code: |
1:
2:
3:
4:
5:
6:
7:
8:
|
________eingabe______________wird_zu____
_____0160 1234567________00491601234567
_____0160 123 4567_______00491601234567
_____00491601234567______00491601234567
_____+491601234567_______00491601234567
_____+49160 123 4567_____00491601234567
_____0160-1234567________00491601234567
_____+47166 123 4567_____00471661234567 |
|
TrioxX
Da hat sich aber jemand Mühe gegeben ^^
Scheint doch zu funktionieren
KrickelD
danke
da müssten dann alle fälle berücksichtigt sein, oder?
vielleicht könnte man noch ne mindestlänge einbauen
TrioxX
Das sieht nach allen Varianten aus, ja.
Aber das mit der Mindestlänge... Wird knapp. Scheint aber auch unnötig.
moonsword
das if, in dem du prüfst, ob es leer ist, kannst du dir sparen...ich denke nicht, dass es leer aufgerufen wird und wenn, dann macht es nichts aus (weiß nicht, ... wenn du viele telefonnummern durchgehst, dann lohnt es sich vielleicht)
sonst...würde ich für die leichtere verarbeitung später, noch ein leerzeichen oder halt die ländervorwahl klar abtrennen, weil sie 1-3 stellig sein kann.
nummernlänge ist beliebig, und dadurch fast nicht überprüfbar...das einzige was du machen kannst ist die nummer per rückreferenzierung im telefonbuch zu suchen und zu schaun, ob sie existiert, aber auch das ist ja kein sicheres ergebnis
KrickelD
das leere return ist zur späteren fehleranalyse, darum steht es noch mit in der funktion.
bei der ländervorwahl kann ich dir (ausnahmsweise mal) nicht zustimmen. nach der umwandlung habe ich immer die ersten 4 zeichen als ländervorwahl, egal aus welchem land und/oder netz.
das leerzeichen kann bei der ausgabe hinzugefügt werden, bei der speicherung hat es noch nichts zu suchen
eine prüfung für telefonbuch etc. wird nicht benötigt weil an diese nummer nachrichten verschickt werden. ist also schnell nachvollziehbar ob es die richtige ist
TrioxX
Jetzt klingelts bei mir so langsam, wofür das Ganze überhaupt ist... ^^
moonsword
| Zitat: |
Original von KrickelD
bei der ländervorwahl kann ich dir (ausnahmsweise mal) nicht zustimmen. nach der umwandlung habe ich immer die ersten 4 zeichen als ländervorwahl, egal aus welchem land und/oder netz. |
hehe da muss ich dir widersprechen
nehmen wir als beispiel: Lichtenstein mit einer vorwahl: +423
damit hättest du 5 ziffern...
anderes beispiel wäre tschechien, irland (+353), island (+354) usw.
Quelle
also würde dir eine fehlen bei der späteren formatierung...wenn die formatierung aber nicht interressant ist, dann ok...ich denke es hat klar was in der speicherung zu suchen...denn rausnehmen ist viel einfacher als wieder sinnvoll hinzuzufügen
edit: musste nur dran denken an das ganze vorwahl gesocks, weil ich sowas auch irgendwo rumfliegen hab, als ich live anrufe auf meine fritzbox gegengecheckt habe mit meinem adressbuch udn dann bild der person und name und nummer groß auf dem bildschirm ausgegeben habe...und bei mir war irland als vorwahl relativ wichtig
edit2: ach, wenn du 6 ziffern für die vorwahl willst, dann nimm mal Jamaika (+1 876) her
amerika an sich hat 6 ziffern für die vorwahl, weil es die +1 ist und dann die regionalvorwahl
achja...da hättest du, wenn du regionalvorwahl nicht willst, aber immer noch ein problem, weil es 3 ziffern dann sind
|
|