DevProTalk

DevProTalk (http://www.devprotalk.com/index.php)
-   Regular expression i htaccess (http://www.devprotalk.com/forumdisplay.php?f=41)
-   -   Text file regexp validator (http://www.devprotalk.com/showthread.php?t=771)

Blood 12. 03. 2006. 13:53

Text file regexp validator
 
Imam neki txt file koji izgleda ovako od prilike:

5.000.000
26.000.000
0.00062
5.000.001
72.000.000
0.00059
...

e sada, taj file treba proveriti da ne sadrzi nista drugo osim onoga sto bi trebalo sadrzati...

Ja sam napisao ovo, ali ne radi.
Evo mog koda:


Kôd:

function validateFile($filename) {
        $file                  = file($filename);
        $rows              = count($filename);
        $line                = 0;
        while($line < $rows) {
                if(preg_match("/\d{1}.\d{3}.\d{3}/",$file[$line])) {
                        $errorMsg                .= "Error at line".$line+1."!";
                }
                if(preg_match("/\d{2}.\d{3}.\d{3}/",$file[$line+1])) {
                        $errorMsg                .= "Error at line".$line+2."!";
                }
                if(preg_match("/\d{1}.\d{6}/",$file[$line+2])) {
                        $errorMsg                .= "Error at line".$line+3."!";
                }
                $line += 3;
        }
        return $errorMsg;
}

kao sto vidite, prva tri reda se sekvencijalno ponavljaju.

Pozdrav i hvala!

BraMom 12. 03. 2006. 14:42

1) $rows = count($filename); ?
trebalo bi da stoji $rows = count($file)

2) "Error at line".$line+1."!"
ovo mozda i radi u nekim verzijama PHP-a, ali nemoj tako da pises, imas string pa konkatenaciju sa integer pa sabiranje integer-a pa opet konkatenaciju...
probaj bar nesto ovako: "Error at line". (string)($line+1) . "!"

3) Koliko mi se cini preg_match vraca 1, tj. true kada string zadovoljava regularni izraz koji si poslao, znaci nedostaje ti jedno not u ovim ifovima

A pre svega bih predlozio da ovaj fajl struktuiras malo, mozda bi bilo bolje da ima strukturu, npr:
5.000.000;26.000.000;0.00062
5.000.001;72.000.000;0.00059
tako bi izbegao ovaj udarac $line += 3; od kog se jezim...

ivanhoe 12. 03. 2006. 17:02

Citat:

Originalno napisao BraMom
ovo mozda i radi u nekim verzijama PHP-a, ali nemoj tako da pises, imas string pa konkatenaciju sa integer pa sabiranje integer-a pa opet konkatenaciju...
probaj bar nesto ovako: "Error at line". (string)($line+1) . "!"

nema potrebe za castingom u string, operator za konkatenaciju ce to da odradi automatski u svim verzijama php, AFAIK... ali zagrade su potrebne jer + i . imaju isti prioritet...

I uzgred koristite uvek ' ' za stringove koji ne treba da se interpoliraju, upotreba "" na cistom textu je obicno trosenje resursa...

Blood 12. 03. 2006. 17:59

OK, hvala, ispravio sam sve sto ste mi rekli i to sada radi...

Imam jos jedno pitanje, da nema neko neku literaturu o regularnim izrazima, jer je na www.php.net ako skrto objasnjeno!

zextra 12. 03. 2006. 19:16

Literature ima koliko hoces...

http://aspn.activestate.com/ASPN/doc...od/perlre.html

Inace, trazis dokumentaciju za PERL Regular Expressions (skraceno "perlre").
Preporucio bih ti simpa programcic za pisanje/testiranje regularnih izraza: The Regex Coach

BraMom 12. 03. 2006. 19:53

@ivanhoe
Ma radice u PHP-u i 5 + 'mica'. tj. nece javljati error, ali hteo sam da napomenem da takav stil kodiranja moze da dovode do gresaka, kao sto je i bio slucaj.

Blood 12. 03. 2006. 20:44

Citat:

Originalno napisao zextra
Literature ima koliko hoces...

http://aspn.activestate.com/ASPN/doc...od/perlre.html

Inace, trazis dokumentaciju za PERL Regular Expressions (skraceno "perlre").
Preporucio bih ti simpa programcic za pisanje/testiranje regularnih izraza: The Regex Coach

Hvala, program vec imam i dosta mi je pomogao, ali dzaba program kad ne znam sta sve mogu da iskoristim :)

tnx again

ivanhoe 13. 03. 2006. 00:39

sad sam tek pogledao regExpe koje si napisao, imas gresku sto je tacka specijalan znak u RE, znaci "bilo koji karakter", ako zelis bas karakter . onda moras da je escapeujes.

Znaci ako zelis da uhvatis 5.000.000 treba da pises /\d\.\d{3}\.\d{3}/ (znaci 2 stvari se razlikuju: ne treba ti {1} to se podrazumeva kad nista ne napises, i tacke moraju da budu escapeovane...). Ovaj regexp ce da prihvati samo zadati format, dok bi tvoja verzija recimo pristala i na 5A000#000 (odnosno bilo koji drugi karakter na mestu tacke)

zextra 13. 03. 2006. 13:02

Zapravo, taj regexp (i ne samo taj, vec sva tri, u obliku u kom se nalaze) bi prihvatio recimo i 0000000000000000000000000 bez vecih problema ;) Gledaj da stavljas ^ i $ na pocetak i kraj regexp-a, da bi proveravao izraz od pocetka do kraja reda, a ne samo neki proizvoljni deo gde se zatekne to sto tebi treba.

ivanhoe 13. 03. 2006. 14:47

^ skroz tacno, moj previd...znaci /^\d\.\d{3}\.\d{3}$/


Vreme je GMT +2. Trenutno vreme je 12:51.

Powered by vBulletin® Verzija 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Copyright © DevProTalk. All Rights Reserved.

Mišljenja, saveti, izjave, ponude ili druge informacije ili sadržaji nastali na Sajtu su vlasništvo onoga ko ih je kreirao, a ne DevProTalk.com, tako da ne morate da se oslanjate na njih.
Autori poruka su jedini odgovorni za ovakve sadržaje. DevProTalk.com ne garantuje tačnost, kompletnost ili upotrebnu vrednost informacija, stavova, saveta ili datih izjava. Ne postoje uslovi pod kojima bi mi bili odgovorni za štetu ili gubitak koji je posledica bilo čijeg oslanjanja na nepouzdane informacije, ili bilo kakve informacije nastale kroz komunikaciju između registrovanih članova.
Web sajt može sadržavati linkove na druge web sajtove na Internetu ili neke druge sadržaje. Ne kontrolišemo niti podržavamo te druge web sajtove, niti smo pregledali bilo kakve sadržaje na takvim sajtovima. Mi nećemo biti odgovorni za legalnost, tačnost ili prikladnost bilo kog sadržaja, oglasa, proizvoda, usluga ili informacije lociranim na ili distribuiranih kroz druge web sajtove, niti za bilo kakvu štetu nastalu kao posledica takvih informacija. DevProTalk.com drži i čuva druga prava vlasništva na web sajtu. Web sajt sadrže materijale zaštićene copyright-om, zaštitne znakove i druge informacije o pravu vlasništva ili softver. Članovi mogu poslatu informacije zaštićene pravima vlasništva njihovih nosilaca i ona ostaju zaštićena bez obzira da li su oni koji prenose te informacije to naveli ili ne. Osim informacija koje su u javnom vlasništvu ili za koje dobijete dozvolu, nemate pravo da kopirate, modifikujete ili na bilo koji način menjate, objavljujete, prenosite, distribuirate, izvršavate, prikazujete ili prodajte bilo koju informaciju zaštićenu pravima vlasništva. Slanjem informacija ili sadržaja na bilo koji deo DevProTalk.com, Vi automatski dozvoljavate i predstavljate garanciju da imate pravo da dozvolite DevProTalk.com ili članovima DevProTalk.com bespovratnu, kontinualnu, neograničenu, globalnu dozvolu da koriste, kopiraju, izvršavaju, prikazuju i distribuiraju takve informacije i sadržaje i da iz takvih sadžaja koriste bilo koji deo u bilo koje svrhe, kao i pravo i dozvolu da koriste gore navedene sadržaje. Svi zaštitni znakovi (trademarks), logotipi, oznake usluga, firme ili imena proizvoda koji se pominju na ovom web sajtu su vlasništvo kojim raspolažu njihovi vlasnici.