Ich arbeite an einer SMS-App und muss in der Lage sein, die Telefonnummer des Absenders von +11234567890 in 123-456-7890 zu konvertieren, damit sie mit Datensätzen in einer MySQL-Datenbank verglichen werden kann .
Die Nummern werden im letzteren Format gespeichert, um sie an anderer Stelle auf der Website zu verwenden, und ich möchte dieses Format lieber nicht ändern, da dafür viel Code geändert werden müsste.
Wie würde ich das mit PHP machen?
Vielen Dank!
php
phone-number
NightMICU
quelle
quelle
Antworten:
quelle
sprintf
oder `printf``? Jemand bitte erkläre es mir. Ich arbeite nur mit US-Telefonnummern und denke nicht, dass es die beste Methode ist, sie mithilfe von Teilzeichenfolgen durch eine Ausgabefunktion zu führen.Dies ist ein US-Telefonformatierer, der mit mehr Versionen von Zahlen arbeitet als jede der aktuellen Antworten.
Und hier ist eine Aufschlüsselung der Regex:
Aktualisiert: 11. März 2015
{0,7}
anstelle von{,7}
quelle
~.*(\d{3})[^\d]*(\d{3})[^\d]*(\d{4})(?:[ \D#\-]*(\d{3,6}))?.*~
.(\d{3}) // 3 digits
[\d]
// Zeichen, das keine Ziffer ist{,7}
aktualisiert werden muss{0,7}
. Ich habe den Code aktualisiert.Diese Funktion formatiert internationale (10+ Ziffern), nicht internationale (10 Ziffern) oder Old School (7 Ziffern) Telefonnummern. Andere Zahlen als 10+, 10 oder 7 Ziffern bleiben unformatiert.
quelle
Angenommen, Ihre Telefonnummern haben immer genau dieses Format, können Sie dieses Snippet verwenden:
quelle
Telefonnummern sind schwer. Für eine robustere, internationale Lösung würde ich diesen gut gepflegten PHP-Port der libphonenumber- Bibliothek von Google empfehlen .
Verwenden Sie es so,
Sie erhalten folgende Ausgabe:
Ich würde empfehlen, das
E164
Format für doppelte Prüfungen zu verwenden. Sie können auch überprüfen, ob es sich bei der Nummer tatsächlich um eine Mobiltelefonnummer handelt (mitPhoneNumberUtil::getNumberType()
) oder ob es sich sogar um eine US-Nummer handelt (mitPhoneNumberUtil::getRegionCodeForNumber()
).Als Bonus kann die Bibliothek so ziemlich jede Eingabe verarbeiten. Wenn Sie sich beispielsweise dafür entscheiden,
1-800-JETBLUE
den obigen Code durchzugehen, erhalten SieNeato.
Es funktioniert genauso gut für andere Länder als die USA. Verwenden Sie einfach einen anderen ISO-Ländercode im
parse()
Argument.quelle
number_formatted
formatiert werden. Daher habe ich beschlossen, einfach eine Spalte in meine Datenbank einzufügen und die formatierten Nummern manuell einzugeben. Verwenden Sie es immer nochlibphonenumber
lokal, um die formatierten Zahlen zu generieren, aber das Einfügen einer so großen Bibliothek für mein kleines Projekt ist einfach übertrieben.Hier ist meine Lösung nur für die USA mit der Vorwahl als optionaler Komponente, einem erforderlichen Trennzeichen für die Erweiterung und Regex-Kommentaren:
Und hier ist das Skript, um es zu testen:
quelle
Hier ist eine einfache Funktion zum Formatieren von Telefonnummern mit 7 bis 10 Ziffern auf europäischere (oder schwedischere?) Weise:
quelle
Das Rad nicht neu erfinden! Importieren Sie diese erstaunliche Bibliothek:
https://github.com/giggsey/libphonenumber-for-php
Es basiert auf der Google-Bibliothek zum Parsen, Formatieren und Überprüfen internationaler Telefonnummern: https://github.com/google/libphonenumber
quelle
Ich sehe, dass dies entweder mit einem regulären Ausdruck oder einigen Substrat-Aufrufen möglich ist (vorausgesetzt, die Eingabe hat immer dieses Format und ändert die Länge nicht usw.).
etwas wie
Sollte es tun.
quelle
Es ist schneller als RegEx.
quelle
Versuchen Sie etwas wie:
Dies würde eine $ -Zahl von dauern
8881112222
und in konvertieren888-111-2222
. Hoffe das hilft.quelle
'.'
sollte ebenfalls aktualisiert'-'
oder entfernt werden. Es wurde aufgrund des jeweiligen Anwendungsfalls aufgenommen - mit sehr geringem Aufwand hätten Sie es konvertierenpreg_replace('/\d{3}/', '$0-', substr($number, 2))
und die Frage direkt beantworten können.Eine weitere Option - einfach zu aktualisieren, um ein Format aus der Konfiguration zu erhalten.
quelle
Alles,
Ich glaube, ich habe es behoben. Arbeiten Sie für aktuelle Eingabedateien und haben Sie die folgenden 2 Funktionen, um dies zu erledigen!
Funktion format_phone_number:
Funktion validate_phone_number:
Beachten Sie, dass ich dies in einer Klassenbibliothek habe, also den Aufruf "self :: validate_phone_number" von der ersten Funktion / Methode.
Beachten Sie die Zeile 32 der Funktion "validate_phone_number", in der ich Folgendes hinzugefügt habe:
um mir die falsche Rückgabe zukommen zu lassen, wenn keine gültige Telefonnummer vorhanden ist.
Ich muss dies noch mit mehr Daten testen, arbeite aber an aktuellen Daten mit dem aktuellen Format und verwende den Stil '8' für diesen bestimmten Datenstapel.
Außerdem habe ich die "Erweiterungs" -Logik auskommentiert, da ich ständig Fehler davon bekam, da ich keine dieser Informationen in meinen Daten habe.
quelle
Dies dauert 7, 10 und 11 Ziffern, entfernt zusätzliche Zeichen und fügt Bindestriche hinzu, indem Sie durch die Zeichenfolge von rechts nach links gehen. Ändern Sie den Bindestrich in ein Leerzeichen oder einen Punkt.
quelle
Ich weiß, dass das OP ein 123-456-7890-Format anfordert, aber basierend auf John Duls Antwort habe ich es so geändert, dass die Telefonnummer in Klammern zurückgegeben wird, z. B. (123) 456-7890. Dieser behandelt nur 7- und 10-stellige Zahlen.
quelle
Hier ist meine Einstellung:
Die
sscanf
Funktion verwendet als zweiten Parameter eine Formatzeichenfolge, die angibt, wie die Zeichen aus der ersten Zeichenfolge zu interpretieren sind. In diesem Fall bedeutet dies 2 Zeichen (%2c
), 3 Zeichen, 3 Zeichen, 4 Zeichen.Normalerweise würde die
sscanf
Funktion auch Variablen enthalten, um die extrahierten Daten zu erfassen. Wenn nicht, werden die Daten in einem Array zurückgegeben, das ich aufgerufen habe$parts
.Die
print
Anweisung gibt die interpolierte Zeichenfolge aus.$part[0]
wird ignoriert.Ich habe eine ähnliche Funktion verwendet, um australische Telefonnummern zu formatieren.
Beachten Sie, dass aus der Perspektive der Speicherung der Telefonnummer:
quelle
Telefonformate für Großbritannien
Für die von mir entwickelte Anwendung stellte ich fest, dass die Benutzer ihre Telefonnummer "korrekt" aus einem für Menschen lesbaren Formular eingegeben, aber verschiedene zufällige Zeichen wie "-" / "+44" usw. eingefügt haben. Das Problem war, dass die Cloud-App dies tat Es musste ziemlich genau über das Format gesprochen werden. Anstatt einen regulären Ausdruck zu verwenden (kann für den Benutzer frustrierend sein), habe ich eine Objektklasse erstellt, die die eingegebene Nummer in das richtige Format verarbeitet, bevor sie vom Persistenzmodul verarbeitet wird.
Das Format der Ausgabe stellt sicher, dass jede empfangende Software die Ausgabe als Text und nicht als Ganzzahl interpretiert (die dann sofort die führende Null verlieren würde) und das Format mit British Telecoms übereinstimmt Richtlinien zur Formatierung von Zahlen - dies unterstützt auch die Einprägsamkeit des Menschen, indem eine lange Zahl in kleine, leicht zu merkende Gruppen unterteilt wird.
+441234567890 produziert (01234) 567 890
02012345678 produziert (020) 1234 5678
1923123456 produziert (01923) 123 456
01923123456 produziert (01923) 123 456
01923hello das ist text123456 produziert (01923) 123 456
Die Bedeutung des Vermittlungssegments der Nummer - in Klammern - besteht darin, dass in Großbritannien und den meisten anderen Ländern Anrufe zwischen Nummern in derselben Vermittlungsstelle ohne das Vermittlungssegment getätigt werden können. Dies gilt jedoch nicht für Telefonnummern der Serien 07, 08 und 09.
Ich bin sicher, dass es effizientere Lösungen gibt, aber diese hat sich als äußerst zuverlässig erwiesen. Weitere Formate können problemlos hinzugefügt werden, indem am Ende die teleNum-Funktion hinzugefügt wird.
Die Prozedur wird somit vom aufrufenden Skript aufgerufen
`
quelle
Dies gilt für Festnetzanschlüsse in Großbritannien ohne Ländercode
Ergebnis:
quelle
Bitte schauen Sie sich die substr-basierte Funktion an, die Formate ändern kann
quelle
Überprüfen Sie die Telefonnummer
quelle