Autor Zpráva
martin6541
Profil
Dobrý den.
Již několik měsíců mám na poli ve formuláři košíku u telefonního čísla nastaveno pravidlo pro zadávání čísla:
pattern="^\+420\s?\d{9}$"

Je technicky možné, aby to v některých případech nefungovalo?
Jednou za měsíc se mi stane, že zákazník tvrdí, že ho to prostě nepustí. Jednou to bylo proto, že číslo vkládal i s mezerou na konci, které si nevšiml. 2x to bylo u uživatele, který byl přihlášen a na proflu měl uloženo číslo špatně. Ale je opravdu technicky možné, aby když do pole napíšu +420123456789 tak mi to vyskočilo jako neplatné?

Jde mi spíš o to, jestli mám hledat nějakou technickou chybu, nekompatibilitu prohlížeče, plugin v prohlížeči, antivir, firewall... nebo řešit samotného uživatele.
Radek9
Profil
martin6541:
Ale je opravdu technicky možné, aby když do pole napíšu +420123456789 tak mi to vyskočilo jako neplatné?
Tohle by podle mě možné být nemělo. Ale jsi si jistý, že to zadával takhle? Hromada lidí by to klidně mohla napsat jako "+420 123 456 789", tedy s mezerami mezi trojčíslími, což už přes tvůj pattern neprojde.
anonym_
Profil *
martin6541:
Přesně tak. U tel. čísla je ten pattern poměrně náročný a různorodý.

Osobně jsem pro variantu, která kontroluje jen povolené znaky (0-9, mezera, +, možno rozšířit o závorky a pomlčku) a délku minimálně 9+ znaků.
martin6541
Profil
řeším jen to, že.... volá zákazník a tvrdí, že to zadává správně a nepustí ho to. Já potřebuji jistotu, že není technicky možné, že to zadá správně a nepustí ho to :)
Pokud mi řeknete, že to prostě nejde zadat správně a mít problém, tak mám jistotu, že chyba je mezi zákazníkem a jeho klávesnicí a mohu to řešit.

PS: Pro jistotu si u dopravce ověřím, jestli by tam snesl nějaké mezery a upravil bych to.

PS2: V popisku píšu návod, jak to zadat a ještě mám placeholder, kde to vidí.
anonym_
Profil *
martin6541:
Nech uživatele zadat formát, na který je zvyklý a který ti tam i přes popisek a placeholder (ten se ztratí, takže není vidět) vloží a pro dopravce to pak případně uprav ty. Zahodit mezery, závorky, pomlčku atd. je poměrně snadné. Přidat trim, nahradit počáteční 00420 za +420 též. A doplnit +420 tam, kde to na začátku není, taky.

Já třeba některá čísla znám (a píši) jen ve formátu XXX XX XX XX, protože jsou natolik hezká, že u nich formát XXX XXX XXX neznám, resp. si ho nepamatuji. Pokud mi tvoje aplikace tohle nevezme, nakoupím u konkurence a tvůj klient ti poděkuje :-)

A závěrem, nemělo by být technicky možné, aby byl ten pattern ignorován tím stylem, že nepustí dobrý vstup. Takže zákazník pravděpodobně kopíruje a má tam nějaký bílý znak na začátku/konci, mezeru navíc, cokoliv.
martin6541
Profil
anonym:
Asi máš ve všem pravdu. Vše tohle vzniklo jen skrz dopravce, který prostě vyžaduje pouze české telefonní číslo a v tomto zápise. To mazaní mezer a podobně vypadá lákavě, ale asi nebude tak jednoduché a nedělá se stejnou, metodou, že?
anonym_
Profil *
martin6541:
Asi by to šlo lépe, až tak dobrý nejsem (nejsem programátor), ale jako základ by to mohlo být třeba nějak takhle:

<?php

$str = [
    '123456789', // OK
    '+420 (605) 44 33 22', // OK
    '00420 000 999 888', // OK
    '123254', // KO (kratke)
    '123254342334234343', // KO (dlouhe)
    '605 AAA 123 123', // OK, 'AAA' se zahodi a zbyde spravne cislo -- dalo by se udelat i KO, pokud bys jako prvni kontroloval nevalidni znaky misto jejich odstraneni
    '605 AAA 123', // KO - po odstraneni 'AAA' kratke
    '605-123456',
    '123123123'
];

foreach ($str as $s) {
    $num = preg_replace('~[^\d+]~', '', $s);
    $num = preg_replace('~^00420~', '+420', $num);
    if (substr($num, 0, 4) !== '+420') {
        $num = '+420' . $num;
    }
    
    if (strlen($num) === 13) {
        echo $num . '<BR>';
    } else {
        echo 'invalid number: ' . $num . '<BR>';
    }
}



Výstup je

+420123456789
+420605443322
+420000999888
invalid number: +420123254
invalid number: +420123254342334234343
+420605123123
invalid number: +420605123
+420605123456
+420123123123
martin6541
Profil
anonym:
děkuji, ale tos nemusel. tohle sám nevyužiju. pro OPC využívám hotovou komponentu a neumím do toho vrtat. Ten pattern ještě zvládnu, to je jednoduché (když se mi podaří poskládat funkční). Asi skončím u toho, že zahrnu použití mezer neomezeně a víc musí stačit.
Prozatím sem na půl cesty:
^\+420\s?[\d\s]{9,12}$
jen to musím dokázat upravit tak, abych mohl zadat přesně devět číslic a libovolně mezer kamkoli.


takto mi to vyhovuje víc... jen jestli by to nemělo jít nějak zjednodušit?
^\s?\+420\s?\d\s?\d\s?\d\s?\d\s?\d\s?\d\s?\d\s?\d\s?\d\s?|\s?00420\s?\d\s?\d\s?\d\s?\d\s?\d\s?\d\s?\d\s?\d\s?\d\s?$
V podstatě chci možnost vložit telefonní číslo o devíti číslicích s mezinárodní předvolbou ve formátu +420 nebo 00420 a kdekoli mít mezery.
Víc asi kupujícímu dovolit nemohu.
_es
Profil
Nie je nič lepšie, ako prísť o zákazníka len preto, že má problém zadať telefónne číslo a tešiť sa, že "ho to nepustilo".
Nechaj ho tam zadať čo chce a na serveri si to spracuj ako chceš ty.
martin6541
Profil
_es:
Nemáš pravdu. Dopravce nepřevezme zásilku bez platného českého mobilního čísla. Dokud jsme to neměli alespoň takto ošefované, tak jsme museli každou druhou objednávku řešit přes emaily a dopisovat či opravovat číslo. A netěší nás ani jedna situace :) Myslím si, že chtít po zákazníkovi jednoduchou informaci není zase tolik... obzvlášť, když je to v jeho zájmu. A já hledám ten správný kompromis.
anonym_
Profil *
martin6541:
V pohodě, mě to moc času nezabralo, a mělo by to plnit účel dostatečně tomu, co uživatelé mohou běžně zadat (mezery kdekoliv, pomlčky, závorky a oba druhy předvoleb). Pokud to (s učesáním) chceš použít, použij, pokud ne, tak ne. Jen jsem toho názoru, že uživatel by měl být schopný zadat cokoliv a ty s tím pak dál pracovat tak, jak potřebuješ. Myslím, že upravit to číslo do požadovaného formátu není tak náročné.

Pokud ti stačí ten tvůj regulár a neodpustíš uživateli chybu (může tam být prázdný zkopírovaný znak nulové šířky, tedy neviditelný), tak použij ten :-) Nevím, jaká je s klientem smlouva, domluva, specifikace, tak těžko říct, jestli to stačí či nikoliv :-) Já mám zkušenost takovou, že labely nečtou a chyby dělají.
martin6541
Profil
anonym:
Dobře... jak tedy doplním \d\s? o možnost zadat "prázdný zkopírovaný znak nulové šířky"
anonym_
Profil *
martin6541:
Spíše jsem tím chtěl naznačit, že zkopírovat může kdokoliv cokoliv a nemusí si toho všimnout. Těch možností, které tam můžou být a můžou být přehlédnuté je X, jedna nulová mezera ten problém nevyřeší (tu jsem uvedl jako příklad, protože není vůbec vidět).

Ale jak jsem psal, pokud ti ten tvůj regex dostačuje, nech ho. Já bych to v zájmu klienta řešil více s ohledem na chybu zákazníka mého klienta, protože lidi chyby dělají (bývám u testování různých aplikací, tak vím, jak to v praxi bývá a co jsou schopni přehlédnout).
_es
Profil
Prečo musí zadať číslo práve v tvare +420...?
Prečo nestačí v "lokálnom" tvare, fungujúcom v Česku?
Čo ak má zákazník nemecké, slovenské, rakúske... číslo?
anonym_
Profil *
_es:
Čo ak má zákazník nemecké, slovenské, rakúske... číslo?
Tady ti odpovím i já. Někteří dopravci neakceptují cizí čísla (a to nejen u nás, ale i v zahraničí si u některých kurýrů neobjednáš s CZ číslem).

A proč +420? Zkus se někdy podívat do specifikace API jakéhokoliv dopravce, některé požadavky a formáty jsou tam pro 21. století naprosto nelogické. To, jestli to budu vyžadovat po zákazníkovi na webu, nebo to případně doplním já na serveru, je druhá věc.
martin6541
Profil
_es:
Čo ak má zákazník nemecké, slovenské, rakúske... číslo?
Tak to podle slov prodejce DPD neakceptuje a zásilku nepřevezme. :(


anonym:
Zkus se někdy podívat do specifikace API jakéhokoliv dopravce
podobné to bývá u dresy... číslo baráku chtějí mimo pole s návem ulice a podobně
Keeehi
Profil
martin6541:
pro OPC využívám hotovou komponentu a neumím do toho vrtat.
Ideálním řešením by bylo si sehnat někoho, kdo se v tom vrtat umí.

Nicméně, když to neumíš upravit na serveru, šlo by to číslo upravit automaticky ještě v prohlížeči zákazníka. Vlastně něco jako napsal anonym ale v javascriptu.

Vaše odpověď


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0