Anzeige

ISO 8601 Standart + preg_match_all

ISO 8601 Standart + preg_match_all | PSD-Tutorials.de

Erstellt von Christian, 11.10.2008.

  1. Christian

    Christian verpeilt & verschallert

    Dabei seit:
    03.03.2005
    Beiträge:
    853
    Geschlecht:
    männlich
    Kameratyp:
    Canon EOS 300D
    ISO 8601 Standart + preg_match_all
    Hallo,
    Ich habe wieder ein kleines Problem. Und zwar muss ich einen String des Formats P2DT16H54M12S (ISO 8601 Code) (liest sich wie folgt: -P-eriod of 2 -D-ays [start of -T-ime] 16 -H-ours 54 -M-inutes and 12-S-econds ) ein einen Timestamp umwandeln.
    Gedacht habe ich dabei an einen Regex des Formats
    Code (Text):
    1. @P((\d*?)\w)T((\d*?)\w)$@i
    Matched ja soweit auch ganz gut, allerdings ist das Ergebnis aus dem preg_match_all folgendes:
    Code (Text):
    1. Array
    2. (
    3.     [0] => Array
    4.         (
    5.         )
    6.  
    7.     [1] => Array
    8.         (
    9.         )
    10.  
    11.     [2] => Array
    12.         (
    13.         )
    14.  
    15.     [3] => Array
    16.         (
    17.         )
    18.  
    19.     [4] => Array
    20.         (
    21.         )
    22.  
    23. )
    und ich weiß nicht wirklich woran das liegt :/
    Über einen Ansatz wäre ich ganz glücklich

    MfG
    Christian
     
    #1      
  2. blackout

    blackout Schaf im Wolfspelz

    Dabei seit:
    12.09.2005
    Beiträge:
    3.359
    Geschlecht:
    männlich
    Ort:
    Würzburg
    Kameratyp:
    Rollei 35 S
    ISO 8601 Standart + preg_match_all
    AW: ISO 8601 Standart + preg_match_all

    Erklär mal genauer was dieser Timestamp aussagt (nein, ich werd mir jetzt nicht die Norm durchlesen).

    Edit: Der Regex gibt nichts aus, weil er nicht zutrifft: @P((\d*?)\w)T((\d*?)\w)$@i
    Im fetten Teil wird auf "X123" geprüft, dann *muss* der String zuende sein ($). Im Fall deines Timestamps kommt dann allerdings noch ein "Y456". Setz hinter die 4. schließende Klammer also mal ein "+" und kuck was passiert.
     
    Zuletzt bearbeitet: 11.10.2008
    #2      
  3. saila

    saila Moderatorle

    Dabei seit:
    21.06.2006
    Beiträge:
    2.239
    Geschlecht:
    männlich
    Ort:
    50°48'23.69" N 7°14'22.19" O
    Software:
    Eclipse, PHP5 OO, MySQL5, CSS(auch Barrierefrei), JS, Symfony
    ISO 8601 Standart + preg_match_all
    AW: ISO 8601 Standart + preg_match_all

    Probier mal das - wenn es dich weiter bringt, kannst du es ja noch verbessern:

    PHP:
    1.  
    2. <?php
    3. $str = 'P2DT16H54M12S';
    4. $str = preg_match_all( '@P([0-9]{1,2})DT([0-9]{1,2})H([0-9]{1,2})M([0-9]{1,2})S@iU' ,
    5.                          $str ,
    6.                          $ausgabe ,
    7.                          PREG_PATTERN_ORDER );
    8.  
    9. echo '<pre>'; print_r( $ausgabe ); echo '</pre>';
    10. echo 'Timestamp: '. mktime( $ausgabe[2][0] , $ausgabe[3][0] , $ausgabe[4][0] , 0 , $ausgabe[1][0] , 0 );
    11. ?>
    12.  
     
    #3      
  4. Christian

    Christian verpeilt & verschallert

    Dabei seit:
    03.03.2005
    Beiträge:
    853
    Geschlecht:
    männlich
    Kameratyp:
    Canon EOS 300D
    ISO 8601 Standart + preg_match_all
    AW: ISO 8601 Standart + preg_match_all

    Danke, dieser Beitrag hat mich auf eine - zwar unschöne - aber funktionierende Idee gebracht. Das Problem daran ist, dass Teile wie P2DT bei 0 Tagen zu PT werden können. Das kann bei allen anderen Angaben wie Minute Sekunde oder Stunde genauso sein, das heißt ([0-9]{1,2})H würde dann nicht mehr matchen.
    Mein letzer Lösungsansatz ist:
    Code (Text):
    1. @P((\d*)\w)?T((\d*)\w)?((\d*)\w)?((\d*)\w)?$@i
    Grundgedanke: Bei der Art von Angabe nach ISO Standart kann max. 1 Vorkommen von \d*\w nach dem P und vor dem T vorkommen; nach dem T kann diese Kombination max. 3 mal vorkommen. Da so eine Angabe auch fehlen kann das "?" hinter Jeder auftretbaren Kombination. Um das ganze dynamisch zu halten das \w statt der expliziten Angabe von D, H, M oder S.
    Um das ganze dann zu einem Timestamp zusammen zu rechnen, folgender Vorgang:
    PHP:
    1.             $TimeLeft = array();
    2.             preg_match_all('@P((\d*)\w)?T((\d*)\w)?((\d*)\w)?((\d*)\w)?$@i', $ItemData->TimeLeft, $TimeLeft);
    3.             $TimeLeftTimestamp = time();
    4.            
    5.             for($i=1; $i<=sizeof($TimeLeft); $i+=2 ){
    6.                 switch(true){
    7.                     case ( isset($TimeLeft[$i][0]) && strpos($TimeLeft[$i][0], 'D')!== false):
    8.                         $res = (int) str_replace('D','',$TimeLeft[$i]);
    9.                         $TimeLeftTimestamp += $res*24*60*60;
    10.                         $res = null;
    11.                     break;
    12.                     case ( isset($TimeLeft[$i][0]) && strpos($TimeLeft[$i][0], 'H')!== false):
    13.                         $res = (int) str_replace('H','',$TimeLeft[$i]);
    14.                         $TimeLeftTimestamp += $res*60*60;
    15.                         $res = null;
    16.                     break;
    17.                     case ( isset($TimeLeft[$i][0]) && strpos($TimeLeft[$i][0], 'M')!== false):
    18.                         $res = (int) str_replace('M','',$TimeLeft[$i]);
    19.                         $TimeLeftTimestamp += $res*60;
    20.                         $res = null;
    21.                     break;
    22.                     case ( isset($TimeLeft[$i][0]) && strpos($TimeLeft[$i][0], 'S')!== false):
    23.                         $res = (int) str_replace('S','',$TimeLeft[$i]);
    24.                         $TimeLeftTimestamp += $res;
    25.                         $res = null;
    26.                     break;
    27.                     default:
    28.                         $TimeLeftTimestamp += 0;
    29.                     break;
    30.                 }
    31.             }
    32.             echo date('Y-m-d H:i:s',$TimeLeftTimestamp);
    @blackout: Dieser Timestamp tritt im Zusammenhang mit der eBay API auf. Bei der Zusammenfassung der eingestellten Artikel bekommt man als Restzeit (d.h. Zeitpunkt jetzt [=time()] + Den oben genannten Timestamp nach ISO Standart.

    Auf dass es einem googelnden Menschen jemals helfen möge.

    Vielen Dank nochmal an Euch, und besonders an saila :)

    grüße
     
    #4      
x
×
×
teststefan