![]() |
Handynummer erkennen
Ich möchte erkennen, ob es sich bei einer Telefonnummer um eine Handynummer (mobile phone number) handelt.
Dazu habe ich mir folgende Code zusammengebaut:
Delphi-Quellcode:
Irgendwelche Ideen, was man noch verbessern könnte?
function IsMobilePhoneNumber(x:string):Boolean;
const vorwahl_DE: array[0..16] of string = ( // T-Mobile '151', '160', '170', '171', '175', // vodafone '152', '162', '172', '173', '174', // E-Plus '157', '163', '177', '178', // O2 '159', '176', '179' ); var p1 : Integer; begin x := StrRemoveChars(x, [' ','P','-']); // Störzeichen entfernen if x = '' then begin Result := False; Exit; end; // Nummer mit diesem Aufbau behandeln // +xx(0)170yyyyyyy if x[1] = '+' then begin // die (0) rausschneiden p1 := Pos('(0)', x); if (p1 > 1) then Delete(x, p1, 3); end; if x[1] ='0' then Result := StrHasPrefix(Copy(x, 2, 10), vorwahl_DE) else if StrHasPrefix(x, ['+49']) then begin Result := StrHasPrefix(Copy(x, 4,10), vorwahl_DE); end else Result := False; end; Oder wie man auch Handynummern im europäischen Ausland erkennen kann? Die Funktionen StrRemoveChars() und StrHasPrefix() stammen aus der JCL. Ich reiche sie hier mal nach für den Fall, dass jemand den Code ohne JCL testen möchte:
Delphi-Quellcode:
function StrRemoveChars(const S: string; const Chars: TSysCharSet): string;
var Source, Dest: PChar; Len, Index: Integer; begin Len := Length(S); SetLength(Result, Len); UniqueString(Result); Source := PChar(S); Dest := PChar(Result); for Index := 0 to Len-1 do begin if not (Source^ in Chars) then begin Dest^ := Source^; Inc(Dest,SizeOf(Char)); end; Inc(Source,SizeOf(Char)); end; SetLength(Result, (Longint(Dest) - Longint(PChar(Result))) div SizeOf(Char)); end; function StrPrefixIndex(const S: string; const Prefixes: array of string): Integer; var I: Integer; Test: string; begin Result := -1; for I := Low(Prefixes) to High(Prefixes) do begin Test := StrLeft(S, Length(Prefixes[I])); if AnsiSameText(Test, Prefixes[I]) then begin Result := I; Break; end; end; end; function StrHasPrefix(const S: string; const Prefixes: array of string): Boolean; begin Result := StrPrefixIndex(S, Prefixes) > -1; end; |
Re: Handynummer erkennen
Wunsch:
Erkennung von Schweizer Handynummern: 076 XXX XX XX, 077 XXX XX XX, 078 XXX XX XX, 079 XXX XX XX |
Re: Handynummer erkennen
|
Re: Handynummer erkennen
vielleicht Rüchgabe des Anbieters.
Ach und "0176" gehört auch zu FONIC. Fonic gehört zu o2 |
Re: Handynummer erkennen
Irgendwo hab ich eigentlich 'ne RegExp dafür rumliegen, aber ich fand sie grade nicht so auf die Schnelle. (aber Google hilft bestimmt notfalls aus)
Nja, warum löschst du denn hier fleißig in den Strings rum und läßt es nicht einfach soeine schöne RegExp erledigen? |
Re: Handynummer erkennen
Zitat:
|
Re: Handynummer erkennen
Zitat:
das ist doch garnicht möglich. Oder? Du kannst ja nicht wissen wer mein Anbieter ist nur weil ich eine bestimmte Nummer habe. @shima: In England gibt es diese unter anderem diese Vorwahlen für Mobilephones: +44 (7824) +44 (7590) +44 (7734) |
Re: Handynummer erkennen
inc(RegExVorschlag) von himitsu.
Ist wahrscheinlich komfortabler und einfach zu warten wenn du einmal das richtig RegEx raus hast. Und wegen den Vorwahlen: Da kann man echt nicht mehr dran fest machen, welcher Anbieter das ist. Durch Rufnummernmitnahme voellig irrelevant geworden. Uebrigens kann man bei einigen Laendern (z.B. USA) nicht erkennen, ob es sich um einen Mobilfunk oder Festnetznummer handelt. |
Re: Handynummer erkennen
Regular Expressions wäre natürlich auch eine Möglichkeit...
Naja hier mal die Version, die auch die Schweizer und Österreicher Handyvorwahlen erkennt. Der Rest wäre dann Fleissarbeit.
Delphi-Quellcode:
function IsMobilePhoneNumber(x:string):Boolean;
const vorwahl_DE: array[0..19] of string = ( // T-Mobile '151', '160', '170', '171', '175', // vodafone '152', '162', '172', '173', '174', // E-Plus '157', '163', '177', '178', // O2 '159', '176', '179', // Rest (simyo, Group 3G,..) '150', '161', '164' ); vorwahl_CH: array[0..3] of string = ( '76', '77', '78', '79' ); vorwahl_AT: array[0..18] of string = ( '650','651','652','653','655','657','659','660','661','663', '664','665','666','667','668','669', '67','68','69' ); vorwahl_GB: array[0..2] of string = ( '7824', '7590', '7734' ); var p1 : Integer; begin x := StrRemoveChars(x, [#10,#13,#9,' ','P','-', ',']); // Störzeichen entfernen if x = '' then begin Result := False; Exit; end; // Nummer mit diesem Aufbau behandeln // +49(0)170xxxxxxx if x[1] = '+' then begin // die (0) rausschneiden p1 := Pos('(0)', x); if (p1 > 1) then Delete(x, p1, 3); end; // Falls die Nummer diesen Aufbau hat // (0170)xxxxxxx // dann die Klammern entfernen if x[1] = '(' then x := StrRemoveChars(x, ['(',')']); case StrPrefixIndex(x, ['+49', '+41', '+43','+44']) of 0: // Deutscheland Result := StrHasPrefix(Copy(x, 4,10), vorwahl_DE); 1: // Schweiz Result := StrHasPrefix(Copy(x, 4,10), vorwahl_CH); 2: // Österreich Result := StrHasPrefix(Copy(x, 4,10), vorwahl_AT); 3: // vereinigtes Königreich Result := StrHasPrefix(Copy(x, 4,10), vorwahl_GB); else if x[1] ='0' then Result := StrHasPrefix(Copy(x, 2, 10), vorwahl_DE) else Result := False; end; end; |
Re: Handynummer erkennen
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:14 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz