Autor Zpráva
majo80
Profil *
Mám telefónne čísla v tvare 0903000000,0948000000,0905000000 a chcel by som ich prerobiť na tvar 421903000000,421948000000,421905000000 t.j. zameniť prvú nulu u každého čísla za 421.
Keeehi
Profil
"421".substr($cislo,1);
majo80
Profil *
Keeehi:
to zmení iba prvú nulu. Ja potrebujem zmeniť každú začiatočnú nulu každého čísla. Skrátka z tuzemského čísla 0907 urobiť medzinárodné 421907.
Majkl578
Profil
Regulárem?

echo preg_replace('~(?<=^|,)0(\d+)~', '421\\1', '0903000000,0948000000,0905000000');
//421903000000,421948000000,421905000000
Keeehi
Profil
majo80:
Nenapadlo mě, že ty čísla máte v řeťezci. Očekával jsem je uložená v poli.
majo80
Profil *
Majkl578:
ďakujem, presne to som potreboval.

Keeehi
moja chyba, nepresne som to napísal
majo80
Profil *
ešte by som potreboval jednu vec. Overiť, či je text s číslami v správnom tvare, t.j. spĺňa tieto podmienky:

1) každé číslo začína na 09.....
2) dĺžka každého čísla je presne 10 znakov
3) minimálny počet čísel je 2
4) maximálny počet čísel je 100

Pravdepodobne je to nemožné, ale veľmi by ste mi pomohli.
Majkl578
Profil
Šlo by to, hned několika způsoby:
a) ponechat regulár, počet kontrolovat po provedení:
$phones = '0903000000,0948000000,0905000000';
$phones = preg_replace('~(?<=^|,)0(9\d{8})~', '421\\1', $phones, -1, $count);
if ($count < 2 || $count > 100) {
    throw new Exception('Bylo zadáno ' . ($count < 2 ? 'méně' : 'více') . '(' . $count . ') než je povoleno.');
}

b) použít regulár na ověření a další na nahrazení
c) nepoužít regulár a udělat něco ošklivého
majo80
Profil *
Funguje to perfektne ale nekontroluje to jednu podmienku a to dĺžku každého čísla - musí byť presne 10 znakov.
Keeehi
Profil
majo80:
Pokud jsi použil kód z [#8], tak to délku kontroluje. Pokud té délce neodpovídá, tak se to číslo nepřevede.
majo80
Profil *
Keeehi:
Áno použil som ten kód, ale to overí či v $phones je viac ako 1 a menej ako 100 tel. čísel. Nie či každé z nich má dĺžku 10 znakov.
Keeehi
Profil
majo80:
„Nie či každé z nich má dĺžku 10 znakov“
S tím si dovolím nesouhlasit.
0(9\d{8})
0 - první čislo je nula            - 1 číslice
9 - druhé číslo je devět           - 1 číslice
\d{8} - právě 8 jakýchkoliv číslic - 8 číslic
                                   -----------
                                    10 číslic
Ten regulár nekontroluje, zda jsou všechny ve správném tvaru. Ale pokud mají požadovaný tvar, tak je převede. Pokud chceš potom ty nepřevedené vymazat, tak to už je zase něco jiného.
nightfish
Profil
Jsem sám, komu by jako vhodné řešení připadlo převést na pole a pracovat s tím jako s polem (místo onanie s RV)?
Keeehi
Profil
nightfish:
Taky mě to napadlo, ale explode, nahrazení a implode bylo vždy minimálně 3x pomalejší a to tam ještě chyběla ta požadovaná kontrola na délku čísla. (vlastně jakákoliv kontrola tam chyběla)

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:

0