Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [JavaScript][JQuery]Sprawdzanie numeru komórkowego, i aktywacja dodatkowych pól
evolucja
post 17.08.2010, 22:55:44
Post #1





Grupa: Zarejestrowani
Postów: 362
Pomógł: 27
Dołączył: 14.09.2009

Ostrzeżenie: (0%)
-----


Mam formularz z 4 polami:
Telefon, Telefon dodatkowy, Checkbox1, Checkbox2

Czy ma ktoś klasę sprawdzającą numer komórkowy? Chodzi mi o to, aby w przypadku wpisania w pole Telefon lub Telefon dodatkowy numeru komórkowego(nie stacjonarnego)uaktywniły się oba checkboxy.

Musiało by to sprawdzać czy numer pasuje do wzorca: '505505505' lub '48505505505'

Będę wdzięczny za wskazówki smile.gif


--------------------
zmoderowano - waga i rozmiar
Go to the top of the page
+Quote Post
Ramzaa
post 18.08.2010, 01:07:26
Post #2





Grupa: Zarejestrowani
Postów: 207
Pomógł: 17
Dołączył: 4.08.2009

Ostrzeżenie: (0%)
-----


http://corpocrat.com/2009/07/15/quick-easy...al-with-jquery/
http://docs.jquery.com/Plugins/Validation/...Methods/phoneUS - polecam

Co prawda jest trochę do modyfikacji, ale lepsze to niż nic.

Ten post edytował Ramzaa 18.08.2010, 01:08:01
Go to the top of the page
+Quote Post
evolucja
post 18.08.2010, 11:43:27
Post #3





Grupa: Zarejestrowani
Postów: 362
Pomógł: 27
Dołączył: 14.09.2009

Ostrzeżenie: (0%)
-----


Klasa z drugiego linku waliduje jedynie fakt, czy podane dane są numeryczne.

Pierwszy natomiast jest okej, wystarczyło by wyrażenie zmienić. Nie wiem jednak jak przerobić tą 'walidację' na 'sprawdzenie'. Bo jakby nie patrzeć to co ja chcę osiągnąć to chyba nie jest taka typowa walidacja..


--------------------
zmoderowano - waga i rozmiar
Go to the top of the page
+Quote Post
thek
post 18.08.2010, 12:03:32
Post #4





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




Czemu trudna lub nietypowa? Wycinasz z numeru wszystko co nie jest cyframi. Sprawdzasz ilość znaków. Jeśli jest mniejsza niż 9 - rąbnięto się z numerem komórki. Jeśli jest równa 9 - OK . A jeśli ma 11 lub 13 - ok, ale wiesz też, że owe 2 lub 4 cyfry z przodu to kierunkowy do kraju w formacie XX lub 00XX smile.gif Co zresztą też możesz sprawdzić i w razie czego rozpoznać ów kraj.

PS.: A dlaczego 00XX jest prawidłowe? bo +XX i 00XX są tym samym. Przy czyszczeniu +48 zamieni Ci się na 48, ale 0048 już nie i to też trzeba uwzględnić w algorytmie
Powód edycji: Mała uwaga co do kierunkowego dla kraju.


--------------------
Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
Go to the top of the page
+Quote Post
evolucja
post 18.08.2010, 12:46:29
Post #5





Grupa: Zarejestrowani
Postów: 362
Pomógł: 27
Dołączył: 14.09.2009

Ostrzeżenie: (0%)
-----


Niestety twój sposób sprawdzania na nic się nie zda, dla przykładu numer:
322259163 nie jest komórkowym, a zawiera dokładnie 9 cyfr.

Chodzi mi o to, że użytkownicy mogą wpisać różne numery: albo komórkowy albo domowy. W przypadku wpisania komórkowego powinny się pojawić automatycznie dodatkowe pola odnośnie powiadomień sms smile.gif

Szczerze to nawet nie wiem jak taką walidację w PHP zrobić biggrin.gif
Obecnie mam tak:
  1. function isMobileNumber($telephone) {
  2. $chars = array('-', ',', ' ', '+');
  3. $telephone = str_replace($chars, '', $telephone);
  4. $telephone = trim($telephone);
  5. if($telephone[0] == '4' && $telephone[1] = '8') { $telephone = substr($telephone, 2); }
  6. if(strlen($telephone) == 9) { return true; } else { return false; }
  7. }

Ale tu przechodzą też zwykłe stacjonarne z numerami kierunkowymi...


--------------------
zmoderowano - waga i rozmiar
Go to the top of the page
+Quote Post
thek
post 18.08.2010, 13:27:03
Post #6





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




Przechodzą, ponieważ w chwili obecnej jest standard taki, by numery były 9-cyfrowe i już. Dlatego była ta heca z 0 w numerach i ciężko połapać było co i jak. Jeśli chodzi o Polskę, to pozostaje Ci jedynie sprawdzanie identyfikatorów sieci czyli 3 pierwszych cyfr. Wiadomo, że numer zaczynający się od 608 był założony w Erze, 888 w Heyah i tak dalej. Teraz to chyba jedyne, w miarę proste, rozwiązanie rozpoznające z jakim telefonem mamy do czynienia, aczkolwiek nie rozpoznasz faktycznej sieci i nie możesz być pewien, że ktoś nie ustawił numeru komórkowego jako domowy-stacjonarny. Tak więc nigdy nie będziesz miał 100% pewności. A co dopiero mówić o zagranicy, czyli tych z 11 lub 13 cyframi innymi niż 48 lub 0048... Na chwilę obecna zostaje Ci wycięcie 3 pierwszych znaków i porównanie ich do wzorców sieci. Nic innego chyba nie wymyślisz.


EDIT: oczywiście sprawdziłeś 48 na starcie, ale czy jesteś pewien, że nie ma telefonów tak się zaczynających? Bo mogłeś wyciąć prawidłowy numer, skracając go do 7 znaków winksmiley.jpg


--------------------
Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
Go to the top of the page
+Quote Post
askone
post 18.08.2010, 13:32:13
Post #7





Grupa: Zarejestrowani
Postów: 654
Pomógł: 121
Dołączył: 27.10.2007
Skąd: Poznań, Łódź

Ostrzeżenie: (0%)
-----


Hej

Aby rozpoznać czy wprowadzony numer jest numerem telefonu komórkowego musisz sprawdzać prefiks międzystrefowy tj. jego 2 pierwsze cyfry (oczywiście po usunięciu 0048 bądź 48). Ponieważ lista tych prefiksów jest zmienna - cały czas pojawiają się nowe - lepiej jest sprawdzać czy ten prefiks nie jest wymieniony na liście prefiksów międzymiastowych - ta lista jest stała, niezmienna. link

Wtedy jeśli prefiks jest na liście to mamy numer międzymiastowy - stacjonarny
Jeśli nie ma to jest to komórka

smile.gif


--------------------
Kliknij jeśli moja odpowiedź Ci pomogła.
askone.pl
Go to the top of the page
+Quote Post
evolucja
post 18.08.2010, 13:48:12
Post #8





Grupa: Zarejestrowani
Postów: 362
Pomógł: 27
Dołączył: 14.09.2009

Ostrzeżenie: (0%)
-----


No i napisałem:
  1. function isMobileNumber($telephone) {
  2. $telephone = preg_replace('/\D/', '', $telephone);
  3. $telephone = trim($telephone);
  4. $kierunkowe = array(75,76,74,71,52,56,54,83,82,81,84,95,68,42,44,43,46,12,18,14,23,29,24,48,25,22,77,13,16,17,15,85,86,87,58,59,33,34,32,41,55,89,62,63,65,67,61,94,91);
  5. if($telephone[0] == '0' && $telephone[1] == '0') { $telephone = substr($telephone, 2); }
  6. if($telephone[0] == '4' && $telephone[1] == '8' && strlen($telephone) == 10) { $telephone = substr($telephone, 2); }
  7. if(strlen($telephone) == 9) {
  8. $dwiepierwsze = substr($telephone, 0, 2);
  9. foreach ($kierunkowe as $kierunkowy) {
  10. if($kierunkowy == $dwiepierwsze) { $e = 1; }
  11. }
  12. if($e != 1) { return true; } else { return false; }
  13. } else { return false; }
  14. }

co o tym sądzicie?
Powinno działać na wszystkie możliwe polskie kombinacje.

Ten post edytował evolucja 18.08.2010, 13:55:45


--------------------
zmoderowano - waga i rozmiar
Go to the top of the page
+Quote Post
askone
post 18.08.2010, 13:53:07
Post #9





Grupa: Zarejestrowani
Postów: 654
Pomógł: 121
Dołączył: 27.10.2007
Skąd: Poznań, Łódź

Ostrzeżenie: (0%)
-----


A dlaczego w tablicy $kierunkowe masz tak wiele numerów? Osobiście nie znam numerów stacjonarnych o kierunkowym 98,99... Zresztą wyznacznik 9xxxx jest wyznacznikiem numeracji skróconej i zarezerwowanej winksmiley.jpg Skorzystaj z listy umieszczonej pod linkiem w moim komentarzu...

Pozdrawiam


--------------------
Kliknij jeśli moja odpowiedź Ci pomogła.
askone.pl
Go to the top of the page
+Quote Post
evolucja
post 18.08.2010, 21:49:33
Post #10





Grupa: Zarejestrowani
Postów: 362
Pomógł: 27
Dołączył: 14.09.2009

Ostrzeżenie: (0%)
-----


Korzystałem z tablicy http://pl.wikisource.org/wiki/Telefoniczne...sce#cite_note-0 w wikipedii. Uwzględniłem też te zarezerwowane. Ale w sumie po co, skoro nie wiadomo co z nimi zrobią. Edytowałem w oparciu o tą twoją listę smile.gif

A teraz jak to zrobić w JQuery? winksmiley.jpg


--------------------
zmoderowano - waga i rozmiar
Go to the top of the page
+Quote Post
pablo89pl
post 20.08.2010, 11:03:17
Post #11





Grupa: Zarejestrowani
Postów: 143
Pomógł: 19
Dołączył: 7.09.2009
Skąd: Rzeszów

Ostrzeżenie: (0%)
-----


a nie łatwiej zrobić to na zasadzie:
Krok 1
wycinasz z ciągu 48(lub inne+48 0048...)
Krok2
potem dajesz regExp na ciąg typu ^\d{9}$
jeśli nie przejdzie to całość weryfikacji bedzie FALSE
jak przejdzie to:
Krok3
dajesz (?<=(^11|^12|^13|^45|^44|^32|^33))\d{7}$

Jeśli to przejdzie to znaczy że ktos wpisał numer stacjonarny więc w całości wychodzi FALSE
jak nie przejdzie to ktoś wpisał komórkowy i wychodzi TRUE


Ewentualnie można to skrócić zamiast kroku 2 i 3:
\d{2}(?<=(^11|^12|^13|^45|^44|^32|^33))\d{7}$ zaznaczy wszystkie te co są stacjonarne

oczywiście musisz dopisac te wszystkie numerki do listy ^11|^12|^13|^45|^44|^32|^33| rozdzielająć |

Pozdrawiam

Ten post edytował pablo89pl 20.08.2010, 11:04:25
Go to the top of the page
+Quote Post
thek
post 20.08.2010, 12:22:46
Post #12





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




Nie można na pałę wycinać 48! To kierunkowy na mazowieckie!
1. Trzeba wywalić wszystko co nie jest cyfrą.
2. Sprawdzić długość ciągu.
3. Jeśli ciąg ma 13 cyfr to tniemy 2 pierwsze i następne 11 zapisujemy do dalszej obróbki. Jeśli 2 pierwsze to '00' idziemy do kroku 4. Jeśli nie - to nie jest prawidłowy numer telefoniczny.
4. Jeśli ciąg ma 11 cyfr to tniemy 2 pierwsze i pozostałe 9 to numer. Możemy owe 2 pierwsze wykorzystać do określenia kraju. Jeśli nie jest on w tablicy, która zawiera kierunkowe do innych krajów - to nie jest prawidłowy numer telefoniczny międzynarodowy. Jeśli jest to 48 -> idziemy do kroku 5, jeśli nie to koniec bo chyba nie będziesz walidował numerów dla każdego kraju z osobna biggrin.gif
5. Jeśli ciąg ma 9 cyfr tniemy 2 pierwsze i porównujemy z kierunkowymi miast by określić czy jest to stacjonarny. Jeśli wyjdzie prawda to mamy do czynienia ze stacjonarnym. Możemy też wyciąć 3 pierwsze i porównać do numerów początkowych sieci komórkowych. Jeśli tutaj trafimy to wiemy, że mamy do czynienia z komórką.

Co jest fajne w tym algorytmie? Kaskadowość winksmiley.jpg Kto nie wie o co mi chodzi niech sprawdzi jak działa switch gdy żaden z case nie posiada break umieszczając w każdym z case jakieś echo winksmiley.jpg Tutaj też to można zastosować.

Tylko zwróć uwage na jedno... W tej funkcji nie możesz zwracać wartości true i false jedynie. Bo numerów międzynarodowych nie możesz tak podzielić. To powinna być funkcja w stylu validPhone, która zwraca: false dla errora, international dla międzynarodowego, polStat dla polskiego stacjonarnego i polMob dla polskiej komórki lub jakiś odpowiednik tego, przykładowo numeryczny 0 -error, 1 - międzynarodowy i tak dalej.

Bym zapomniał. Po co masz szaleć z wyrażeniami regularnymi co sugeruje pablo, skoro możesz wykorzystać prostsze in_array?
Powód edycji: [thek]:


--------------------
Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
Go to the top of the page
+Quote Post
pablo89pl
post 20.08.2010, 12:24:52
Post #13





Grupa: Zarejestrowani
Postów: 143
Pomógł: 19
Dołączył: 7.09.2009
Skąd: Rzeszów

Ostrzeżenie: (0%)
-----


Cytat(thek @ 20.08.2010, 13:18:38 ) *
Nie można na pałę wycinać 48! To kierunkowy na mazowieckie!

Ale przy numerze +48481112223
wycinajac "48" 2 razy, zostaje CI 7 cyfr, i automatycznie numer jest odrzucony bo nie jest komórkowym....jeśli raz to i tak jest odrzucony bo w w/w preze mnie sposobie realizacji tego problemu są porównywane równiez i te początki...

@thek: pewnie że można smile.gif rozwiązań jest multum, przedstawione przeze mnie to tylko opcja

Wydaje mi się żę rozwiązanie z wyr. regularnym będzie szybsze niż wycinanie znaków, sprawdzanie tablic...a na pewno krótsze smile.gif

Ten post edytował pablo89pl 20.08.2010, 12:28:30
Go to the top of the page
+Quote Post
thek
post 20.08.2010, 12:35:31
Post #14





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




Zostaje odrzucony jako komórkowy i fajnie jeśli jest to tylko sprawdzenie "komórka czy nie?", ale zauważ, że podniosłem tutaj problem numerów międzynarodowych także. Jeśli ktoś da 49 + 9-cyfrowy numer (numer w Niemczech) to znowu dostaniesz false lub co gorsza przejdzie dalej pchając do regexpa wyrażenie 49 + 7 cyfr z 9 -cyfrowego numeru i może zrobić jazdę (to czy tak by się stało zależałoby od implementacji), jeśli wbiłoby się w prawidłowy numer kierunkowy (49 to tylko przykład, mógłby być kierunkowy innego kraju zgodny z międzymiastowym w naszym kraju). Lepiej takich problemów uniknąć smile.gif
Powód edycji: [thek]: Wsio gra i buczy :D A niektórzy z modami by tylko darli koty. Mod też człowiek i pogadać z nim można.


--------------------
Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
Go to the top of the page
+Quote Post
pablo89pl
post 20.08.2010, 12:52:32
Post #15





Grupa: Zarejestrowani
Postów: 143
Pomógł: 19
Dołączył: 7.09.2009
Skąd: Rzeszów

Ostrzeżenie: (0%)
-----


Cytat(thek @ 20.08.2010, 13:35:31 ) *
Zostaje odrzucony jako komórkowy i fajnie jeśli jest to tylko sprawdzenie "komórka czy nie?"

Moje rozwiązanie jest oczywiście tylko do wymienoinego przez CIebie problemu, co do reszty zgadzam się całkowicie:)
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 25.04.2024 - 17:11