Pracuję nad aplikacją do obsługi SMS - ów i muszę mieć możliwość konwersji numeru telefonu nadawcy z +11234567890 na 123-456-7890, aby można go było porównać z rekordami w bazie danych MySQL .
Liczby są przechowywane w tym drugim formacie do wykorzystania w innym miejscu na stronie i wolałbym nie zmieniać tego formatu, ponieważ wymagałoby to modyfikacji dużej ilości kodu.
Jak mam się do tego zabrać z PHP?
Dzięki!
php
phone-number
NightMICU
źródło
źródło
Odpowiedzi:
źródło
sprintf
lub `` printf ''? Niech mi ktoś wyjaśni. Pracuję tylko z numerami telefonów w USA i nie sądzę, aby przepuszczanie ich przez funkcję wyjściową przy użyciu podłańcucha było najlepszą metodą.To jest amerykański program do formatowania telefonów, który działa na większej liczbie wersji liczb niż jakiekolwiek bieżące odpowiedzi.
A oto podział wyrażenia regularnego:
Zaktualizowano: 11 marca 2015 r. Do użycia
{0,7}
zamiast{,7}
źródło
~.*(\d{3})[^\d]*(\d{3})[^\d]*(\d{4})(?:[ \D#\-]*(\d{3,6}))?.*~
.(\d{3}) // 3 digits
[\d]
// znak, który nie jest cyfrą{,7}
aktualizacji{0,7}
. Zaktualizowałem kod.Ta funkcja formatuje numery telefonów międzynarodowe (ponad 10 cyfr), nie-międzynarodowe (10 cyfr) lub oldschoolowe (7 cyfr). Wszystkie liczby inne niż 10+, 10 lub 7 cyfr pozostaną niesformatowane.
źródło
Zakładając, że Twoje numery telefonów zawsze mają dokładnie ten format, możesz użyć tego fragmentu:
źródło
Numery telefonów są trudne. Aby uzyskać bardziej niezawodne, międzynarodowe rozwiązanie, poleciłbym ten dobrze utrzymany port PHP biblioteki libphonenumber firmy Google .
Używając tego w ten sposób,
otrzymasz następujący wynik:
Zalecam użycie
E164
formatu do podwójnych kontroli. Możesz również sprawdzić, czy jest to numer telefonu komórkowego, czy nie (używającPhoneNumberUtil::getNumberType()
), czy nawet numer amerykański (używającPhoneNumberUtil::getRegionCodeForNumber()
).Dodatkowo biblioteka może obsłużyć prawie każde wejście. Jeśli, na przykład, zdecydujesz się uruchomić
1-800-JETBLUE
powyższy kod, otrzymaszNeato.
Działa równie dobrze w krajach innych niż Stany Zjednoczone. Po prostu użyj innego kodu kraju ISO w
parse()
argumencie.źródło
number_formatted
kolumnę w mojej bazie i ręcznie wpisać sformatowane numery. Nadal używamlibphonenumber
lokalnie do generowania sformatowanych liczb, ale włączenie tak ogromnej biblioteki do mojego małego projektu jest po prostu przesadą.Oto moje rozwiązanie tylko w USA, z numerem kierunkowym jako opcjonalnym składnikiem, wymaganym ogranicznikiem dla rozszerzenia i komentarzami do wyrażenia regularnego:
A oto skrypt do przetestowania:
źródło
Oto prosta funkcja formatowania numerów telefonów zawierających od 7 do 10 cyfr w bardziej europejski (lub szwedzki?) Sposób:
źródło
Nie wynajduj koła na nowo! Zaimportuj tę niesamowitą bibliotekę:
https://github.com/giggsey/libphonenumber-for-php
Opiera się na bibliotece Google do analizowania, formatowania i sprawdzania międzynarodowych numerów telefonów: https://github.com/google/libphonenumber
źródło
Widzę, że jest to możliwe przy użyciu jakiegoś wyrażenia regularnego lub kilku wywołań substr (zakładając, że dane wejściowe są zawsze w tym formacie i nie zmieniają długości itp.)
coś jak
powinien to zrobić.
źródło
Jest szybszy niż RegEx.
źródło
Spróbuj czegoś takiego:
zajęłoby to liczbę $
8881112222
i zostało przekonwertowane na888-111-2222
. Mam nadzieję że to pomoże.źródło
'.'
powinien również zostać zaktualizowany'-'
lub usunięty. Zostało dołączone ze względu na konkretny przypadek użycia - przy niewielkim wysiłku można było go przekonwertowaćpreg_replace('/\d{3}/', '$0-', substr($number, 2))
i bezpośrednio odpowiedzieć na pytanie.Inna opcja - łatwa aktualizacja, aby otrzymać format z konfiguracji.
źródło
Wszystko,
Chyba to naprawiłem. Pracuje dla bieżących plików wejściowych i ma następujące 2 funkcje, aby to zrobić!
funkcja format_numer_telefonu:
funkcja validate_phone_number:
Zauważ, że mam to w bibliotece klasy, więc wywołanie „self :: validate_phone_number” z pierwszej funkcji / metody.
Zwróć uwagę na wiersz # 32 funkcji „validate_phone_number”, w którym dodałem:
aby otrzymać fałszywy zwrot, jeśli nie jest to ważny numer telefonu.
Nadal muszę to przetestować na większej ilości danych, ale pracuję na bieżących danych, z aktualnym formatem i używam stylu „8” dla tej konkretnej partii danych.
Skomentowałem także logikę „rozszerzenia”, ponieważ ciągle otrzymywałem błędy, widząc, że nie mam żadnej z tych informacji w moich danych.
źródło
zajmuje to 7, 10 i 11 cyfr, usuwa dodatkowe znaki i dodaje myślniki, przechodząc od prawej do lewej przez ciąg. zamień myślnik na spację lub kropkę.
źródło
Wiem, że OP żąda formatu 123-456-7890, ale na podstawie odpowiedzi Johna Dula zmodyfikowałem go tak, aby zwracał numer telefonu w nawiasach, np. (123) 456-7890. Ten obsługuje tylko liczby 7 i 10 cyfrowe.
źródło
Oto moja opinia:
sscanf
Funkcja przyjmuje jako drugi parametr ciąg formatu informując go, jak interpretować znaki od pierwszego łańcucha. W tym przypadku oznacza to 2 znaki (%2c
), 3 znaki, 3 znaki, 4 znaki.Zwykle
sscanf
funkcja zawierałaby również zmienne do przechwytywania wyodrębnionych danych. Jeśli nie, dane są zwracane w tablicy, którą wywołałem$parts
.print
Oświadczenie wyprowadza interpolowanej ciąg.$part[0]
jest ignorowany.Użyłem podobnej funkcji do formatowania australijskich numerów telefonów.
Zwróć uwagę, że z punktu widzenia przechowywania numeru telefonu:
źródło
Formaty telefonów w Wielkiej Brytanii
W przypadku aplikacji, którą opracowałem, zauważyłem, że ludzie wpisywali swój numer telefonu „poprawnie” z postaci czytelnej dla człowieka, ale wstawiali różne losowe znaki, takie jak „-” / „+44” itp. Problem polegał na tym, że aplikacja w chmurze, która trzeba było porozmawiać, był dość konkretny co do formatu. Zamiast używać wyrażenia regularnego (może to być frustrujące dla użytkownika), stworzyłem klasę obiektu, która przetwarza wprowadzoną liczbę do prawidłowego formatu przed przetworzeniem przez moduł trwałości.
Format danych wyjściowych zapewnia, że każde oprogramowanie odbierające interpretuje dane wyjściowe jako tekst, a nie jako liczbę całkowitą (która natychmiast straciłaby wiodące zero), a format jest zgodny z British Telecoms wskazówki dotyczące formatowania liczb - co również ułatwia zapamiętywanie przez ludzi, dzieląc dużą liczbę na małe, łatwe do zapamiętania grupy.
+441234567890 produkuje (01234)
567890 02012345678 produkuje (020) 1234 5678
1923123456 produkuje (01923) 123 456
01923123456 produkuje (01923) 123 456
01923, to jest tekst123456 produkuje (01923) 123 456
Znaczenie segmentu giełdy numeru - w nawiasach - polega na tym, że w Wielkiej Brytanii i większości innych krajów połączenia między numerami w tej samej centrali można wykonywać z pominięciem segmentu giełdy. Nie dotyczy to jednak numerów telefonów z serii 07, 08 i 09.
Jestem pewien, że są bardziej wydajne rozwiązania, ale ten okazał się wyjątkowo niezawodny. Więcej formatów można łatwo dostosować, dodając na końcu funkcję teleNum.
W ten sposób procedura jest wywoływana ze skryptu wywołującego
`
źródło
Dotyczy telefonów stacjonarnych w Wielkiej Brytanii bez numeru kierunkowego kraju
Wynik:
źródło
Proszę spojrzeć na funkcję opartą na substracie, która może zmieniać formaty
źródło
Sprawdź numer telefonu
źródło