Autor | Zpráva | ||
---|---|---|---|
Sniclman Profil * |
#1 · Zasláno: 16. 9. 2011, 10:53:02
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 |
#2 · Zasláno: 16. 9. 2011, 15:44:55
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 * |
#3 · Zasláno: 16. 9. 2011, 16:11:45
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 |
#4 · Zasláno: 16. 9. 2011, 16:20:14
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). |
||
Časová prodleva: 13 let
|
0