Autor Zpráva
Evžen
Profil *
Dobrý den, prosím o pomoc s formátování tel. čísel.
V databázi jsou čísla v různých tvarech, tak jak je uživatelé zadali.
Tzn. např. 420/666123456, +420 666 123456, +420666123456, 666123456, 123 45 atd.
Potřeboval bych poradit s regulárem, který by z proměnné vytáhl pouze číslice (a případně i počáteční "+") a znovu by číslo uložit to proměnné ve tvaru +420 721 123 456, případně jen 721 123 456, pokud předvolba chybí.
Děkuji moc!
Str4wberry
Profil
Na stránku www.regularnivyrazy.info/telefonni-cislo.html jste se díval?
Evžen
Profil *
Ano, ale nepodařilo se mi to rozchodit...
Str4wberry
Profil
Aha. A k jakému kódu jste tedy dospěl a jaký máte problém?
Evžen
Profil *
V podstatě jsem nedospěl k žádnému kódu, jen jsem zkoušel dát do preg_replace ten regulár, co je uvedený na té stránce.
Problém je, že nevím, jak to zkonstruovat.
Můžete mi prosím napsat řešení? Tedy něco jako $telefon=preg_replace("...", "...", $telefon);.
Předpokládám, že je řešení bude úplně banální, ale asi jsem idiot, protože do regexp se mi nedaří proniknout... :)
KubaFibi
Profil
zkus toto:
$cislo = preg_replace("~^\+?(\d\d\d)?[ /]?(\d\d\d) ?(\d\d\d) ?(\d\d\d)$~", "\\1 \\2 \\3 \\4", $cislo);

Možná by se dali ty \d\d\d nahradit za kratší \d{3}, jak je to napsané na té stránce, ale když jsem to vyzkoušel tak to nešlo. Myslím, že aby to fungovalo, tak by ty čísla v trojici musela být stejná. Možná se pletu. Jinak ten regulár co jsem vložil mi funguje na všechny formáty z tohoto pole:

Array("+420123456789", "420123456789", "420/666123456", "+420/666123456", "+420 123 456 789", "420 123 456 789", "123456789", "123 456 789");

Výsledek je pak ve formátu xxx xxx xxx nebo xxx xxx xxx xxx - bez plusu
Evžen
Profil *
Super, tohle funguje. Akorát ten plus mi to tam převádí taky - ty píšeš, že u tebe je výsledek bez plusu, to je divné...
KubaFibi
Profil
To je opravdu divné, zkusil jsem to znovu, abych se ujistil a plus u žádného z těch čísel nemám.

Nemohlo se stát, že si při kopírování něco třeba omylem umázl? Ono tam stačí např. přesunout jednu závorku a už by to tomu odvovídalo. Viz. dále:
$cislo = preg_replace("~^\+?(\d\d\d)?[ /]?(\d\d\d) ?(\d\d\d) ?(\d\d\d)$~", "\\1 \\2 \\3 \\4", $cislo);
$cislo = preg_replace("~^(\+?\d\d\d)?[ /]?(\d\d\d) ?(\d\d\d) ?(\d\d\d)$~", "\\1 \\2 \\3 \\4", $cislo);

Jinak mě opravdu nenapadá, jak je možné, že tam to + zůstane.
################################################
EDIT:
Ještě mě napadlo, jestli některá čísla nemáte ve formátu + xxx xxx xxx xxx (mám na mysli tu mezeru mezi + a předvolbou). Kdyby jste takové číslo měl, tak tam plus zůstane, ovšem to číslo by ani nemělo projít funkcí preg_replace(). Kdyby to číslo bylo např. + 420 123 456 789, tak by se asi nedalo poznat, že to funkcí neprošlo.

Pokud by tedy byla taková čísla, jak jsem psal - "s mezerou", stačí upravit regexp následovně:
$cislo = preg_replace("~^\+? ?(\d\d\d)?[ /]?(\d\d\d) ?(\d\d\d) ?(\d\d\d)$~", "\\1 \\2 \\3 \\4", $cislo);
Evžen
Profil *
Mám to opravdu přesně tak, jak jsi mi to uvedl... a opravdu to funguje tak, jako by byl použit ten druhý řádek - $cislo = preg_replace("~^(\+?\d\d\d)?[ /]?(\d\d\d) ?(\d\d\d) ?(\d\d\d)$~", "\\1 \\2 \\3 \\4", $cislo);. Zvláštní...
Ale to nevadí, ono je to tak i možná lepší :).
Díky moc!
KubaFibi
Profil
Možná je to jiným nastavením php.ini (jediné co mě napadlo), ale v tom už se moc nevyznám, tak nevím. Nicméně jsem rád, že jsem pomohl.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

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