Avatar billede KlausEC Nybegynder
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
Avatar billede KlausEC Nybegynder
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
Avatar billede KlausEC Nybegynder
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.
Avatar billede coderdk Praktikant
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 ;)
Avatar billede KlausEC Nybegynder
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
Avatar billede coderdk Praktikant
25. januar 2010 - 13:02 #5
Hmm prøv at køre en:

$data = utf8_decode( $data );

før...
Avatar billede KlausEC Nybegynder
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...
Avatar billede coderdk Praktikant
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...
Avatar billede KlausEC Nybegynder
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
Avatar billede KlausEC Nybegynder
24. februar 2010 - 15:53 #9
løsningen måtte findes i '\0', der var foran hvert tegn...
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester