Autor Zpráva
Sniclman
Profil *
Dobrý den,

mám řetězec znaků
$data = ";2013,,a1;2013,,a2;2013,,a3;2013,,a10;2013,,a20;2013,,a30;2013,,a40;2013,,a45;2013,,a50";


potřebuji z toho řetězce dostat řetězce končící znaky a(čísla od 1 do 45).

zkoušel jsem tento zápis
preg_match_all("/;2013,([^;]*),a([0-9]|[1-4][0-5])/U", $data, $out);


výsledek je ale bohužel následující
Array ( [0] => ;2013,,a1 [1] => ;2013,,a2 [2] => ;2013,,a3 [3] => ;2013,,a1 [4] => ;2013,,a2 [5] => ;2013,,a3 [6] => ;2013,,a4 [7] => ;2013,,a4 [8] => ;2013,,a5 ) 


v podstatě to vezme vše co po písmenu "a" začíná [0-9]. Můžete mi prosím poradit jak správně napsat podmínku aby to vzalo "a1" až "a45" ?

Děkuji předem za veškeré rady.
Casper
Profil
Přijdete na konec lookahead assertion (?=;). Také nechápu k čemu tam máte ([^;]*) když mezi čárkami v ukázce nikdy nic není (vynecháním se tedy i modifikátor U stává bezvýznamným). A skupinu čísel bych udělal pasivní (sejde však na vás, co potřebujete mít ve výsledném poli). Tedy nějak takto:
preg_match_all("/;2013,,a(?:[0-9]|[1-4][0-5])(?=;)/", $data, $out);
sniclman
Profil *
Mezi čárkami se může a nemusí vyskytovat text o libovolné délce, musí být tak řešena ochrana proti zadání oddělovacího znaku ";"v textovém poli.

Co myslíte tím, že by skupina čísel měla být pasivní?

Ovšem děkuji za poučení ohledně lookahead. Tuto funkci jsem neznal.
Casper
Profil
Pasivní skupina se od normální liší pouze tím, že není vracena (v poli $out ani ve zpětných referencích).

Normální skupina:
(group)

Pasivní skupina:
(?:group)


Pokud tedy nechcete mít zbytečně zachycená čísla v poli $out, použijte pasivní skupinu (viz moje ukázka).

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