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 DE-CIX
Edge computing: behandling ved kilden
Edge computing revolutionerer den måde, data behandles på, ved at bringe kapacitet og ydeevne tættere på dér, hvor der er behov for det.
15. april 2025
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