PDA

Pogčedajte punu verziju : Text file regexp validator


Blood
12. 03. 2006., 13:53
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:


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
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/docs/ActivePerl-5.6/lib/Pod/perlre.html

Inace, trazis dokumentaciju za PERL Regular Expressions (skraceno "perlre").
Preporucio bih ti simpa programcic za pisanje/testiranje regularnih izraza: The Regex Coach (http://www.weitz.de/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
Literature ima koliko hoces...

http://aspn.activestate.com/ASPN/docs/ActivePerl-5.6/lib/Pod/perlre.html

Inace, trazis dokumentaciju za PERL Regular Expressions (skraceno "perlre").
Preporucio bih ti simpa programcic za pisanje/testiranje regularnih izraza: The Regex Coach (http://www.weitz.de/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}$/

Blood
13. 03. 2006., 14:57
Hvala Vam obojci, imate pivo od mene kad se budemo videli! :beer: :)