22. januar 2010 - 14:38
Der er
8 kommentarer og 1 løsning
regular expression, specialtegn
hey, Jeg vil gerne matche følgende streng (eksempel): "21-01-2010 12:00:00 93,15" (det store mellemrum er tabulator, hvis nogen skulle være i tvivl...) jeg har prøvet: if (preg_match("/(\d+)\S(\d+)\S(\d+).(\d+):(\d+):(\d+)\t(\d+)\S(\d+)",$data)) { //blah } intet synes at fange kolon mellem time, minut, sekund... har også prøvet at fange netop dem som [\:] som \: som :{1} som snart hvad som helst... Jeg kan sq ikke få den til at makke ret og er ved at få grå hår af det... nogle regex-hajer derude med et par forslag? :P
Annonceindlæg fra Computerworld it-jobbank
22. januar 2010 - 15:52
#1
jeg har imellemtiden fundet ud af, at det nok ikke er kolon, der fejler, men timen (og evt sekundet, men så langt når den ikke), dvs 12:00 :00
22. januar 2010 - 16:41
#2
en ny opdagelse! Jeg tror, det hele skyldes, at jeg åbner en windows-genereret tekstfil på en linux maskine. Jeg bruger fopen($file, 'r') til at åbne den med.
22. januar 2010 - 21:02
#3
Skriv den direkte om: $t = "21-01-2010 12:00:00 93,15"; $p = "/(\d+)-(\d+)-(\d+) (\d+):(\d+):(\d+)\t([\d,]+)/"; if ( preg_match( $p, $t, $m ) ) { echo "Match"; } else { echo "Ingen match"; } Virker (såfremt du er sikker på at det store mellemrum er \t ;)
25. januar 2010 - 10:43
#4
jeg har nu rettet min kode til efter ovenstående forslag: if (preg_match("/(\d+)-(\d+)-(\d+) (\d+):(\d+):(\d+)\t([\d,]+)/", $data)) { //min kode. } else { echo "line mismatch\n"; } jeg får output "line mismatch ..." for alle datalinierne. jeg tror som tidligere nævnt, at problemet skyldes, at filen er genereret i windows, og delt herpå. Mappen bliver så mountet på min linux, som så prøver at læse indholdet. Hvis jeg åbner filen med nano, ser indholdet således ud: ^@2^@0^@-^@0^@1^@-^@2^@0^@1^@0^@ ^@2^@1^@:^@0^@0^@:^@0^@0^@ ^@2^@8^@3^@2^@,^@2^@8^@0^@0 som så svarer til 20-01-2010 21:00:00 2832,2800
25. januar 2010 - 13:02
#5
Hmm prøv at køre en: $data = utf8_decode( $data ); før...
25. januar 2010 - 13:21
#6
nu ser min kode sådan ud: $data = utf8_decode($data); if (preg_match("/(\d+)-(\d+)-(\d+) (\d+):(\d+):(\d+)\t([\d,]+)/", $data)) { //min kode. } else { echo "line mismatch\n"; } får mismatches stadigvæk...
25. januar 2010 - 13:33
#7
Prøv en var_dump( $data ); efter utf8_decode'en så vi lige kan se hvad PHP siger der er i $data...
26. januar 2010 - 16:04
#8
Jeg har lavet følgende tests: var_dump($day); var_dump($month); var_dump($year); var_dump($hour); var_dump($minute); var_dump($second); Ovenstående giver (eksempelvis): string(4) "24" string(5) "01" string(9) "2010" string(5) "13" string(5) "01" string(5) "13" Jeg prøver så at parse værdierne: echo "hour: $hour, minute: $minute, second: $second, month: $month, day: $day, year: $year\n"; echo "(int)hour: ".(int)$hour.", (int)minute: ".(int)$minute.", (int)second: ".(int)$second.", (int)month: ".(int)$month.", (int)day: ".(int)$day.", (int)year: ".(int)$year."\n"; Ovenstående giver hour: 13, minute: 01, second: 13, month: 01, day: 24, year: 2010 (int)hour: 0, (int)minute: 0, (int)second: 0, (int)month: 0, (int)day: 2, (int)year: 0
24. februar 2010 - 15:53
#9
løsningen måtte findes i '\0', der var foran hvert tegn...
Vi tilbyder markedets bedste kurser inden for webudvikling