Måsk smart. men fatter O af hvad der sker... hvis det så bare var noget med if (... :|
Synes godt om
Slettet bruger
17. maj 2004 - 22:57#8
OK, jeg forklarer lidt:
/^(\d?\d)[^\d](\d?\d)[^\d](\d{4})$/
Dette er en såkaldt RegExp, som er en slags avanceret tekstfilter, der kan afsindigt mange underlige ting. Her har jeg dog ikke brugt det helt vilde.
/ er bare en start- (og slut) markør. \d betyder et ciffer \d? betyder et ciffer eller ingenting \d?\d betyder dermed et ciffer eller ingenting efterfulgt af et ciffer - dvs et eller 2 cifre [^\d] betyder et tegn, der ikke er et ciffer \d{4} betyder 4 cifre
^ betyder start på strengen (Undtagen når det står i []) $ betyder slut på strengen
() bruges til at markere ting, der skal bruges i erstat-delen.
Så hele den lange kode /^(\d?\d)[^\d](\d?\d)[^\d](\d{4})$/ betyder altså
Strengen begynder med 1 eller 2 cifre, som vi gemmer som $1, derefter kommer et tegn, der ikke er et tal, efterfulgt af 1 eller 2 cifre, som vi gemmer som $2. Så er der endu et ikke-tal og tilsidst 4 cifre, som vi gemmer som $3. Så er strengen slut.
Hvis $Dato passer på ovennævnt beskrivelse, så bliver den lavet om til '$3-$2-$1' dvs. det vi gemte ovenfor, bare i omvendt rækkefølge og med minus imellem.
Noget tilsvarende sker med det andet $soeg/$erstat-par.
Når $dato er lavet om til 2004-17-05, splitter explode() den op i de tre elementer, som så bliver puttet i passende variable.
jeg har lavet en i Visual Basic.. men ville godt have den lavet om til PHP :)
Private Sub Form_Load() Me.Caption = Date2Num("hej2004med05dig17exp") 'Return 17/05-2004 Me.Caption = Date2Num("exp17hej05med2004dig") 'Return 17/05-2004 End Sub
Public Function Date2Num(ByVal strDato As String) As String Dim i As Integer, c As Integer Dim strOne As String, blnNumber As Boolean Dim arrOut(2) As String 'month, day, year For i = 1 To Len(strDato) strOne = Mid$(strDato, i, 1) Select Case strOne Case 0 To 9 If c <= 2 Then arrOut(c) = (arrOut(c) & strOne) blnNumber = True End If Case Else If blnNumber = True Then c = c + 1 blnNumber = False End If End Select Next If Len(arrOut(2)) = 4 Then Date2Num = (arrOut(0) & "/" & arrOut(1) & "-" & arrOut(2)) ElseIf Len(arrOut(0)) = 4 Then Date2Num = (arrOut(2) & "/" & arrOut(1) & "-" & arrOut(0)) End If End Function
Synes godt om
Slettet bruger
17. maj 2004 - 23:40#11
Den fatter jeg så ikke meget af. (Og så alligevel - jeg kan vidst godt se, hvad der foregår.)
Jeg har rettet i regexp, så den også godtager hele ord og sætninger imellem tallene. Dermed gør vores to scripts nærmest det samme. (Bortset fra at den putter det i mktime())
<?php function Date2Num($Dato) { // tre klumper tal med andre tegn uden om $soeg[]='/^[^\d]*(\d+)[^\d]+(\d+)[^\d]+(\d+)[^\d]+$/'; $erstat[]='$1-$2-$3';
// Deler 8 cifre op som XXXX-XX-XX $soeg[]='/^[^\d]*(\d{4})(\d{2})(\d{2})[^\d]*$/'; $erstat[]='$1-$2-$3';
Ja nu kommer der ikke nogle fejl, men den retuner heller ikke noget.
Jeg tester det sådan:
<?php echo Date2Num("17/05-2004"); ?>
Synes godt om
Slettet bruger
18. maj 2004 - 23:15#18
Der var et + som skulle have været en *
<?php function Date2Num($Dato) { // tre klumper tal med andre tegn uden om $soeg[]='/^[^\d]*(\d+)[^\d]+(\d+)[^\d]+(\d+)[^\d]*$/'; $erstat[]='$1-$2-$3';
// Deler 8 cifre op som XXXX-XX-XX $soeg[]='/^[^\d]*(\d{4})(\d{2})(\d{2})[^\d]*$/'; $erstat[]='$1-$2-$3';
Pyha.. fik det til at virke, måtte lave lidt om på det i arrOut[0,1,2] men nu skulle det virke.. Takker mange gange for hjælpen :-)
<?php function Num2Date($Number) { return date("d/m-Y", $Number); } ?> <?php function Date2Num($Dato) { // tre klumper tal med andre tegn uden om $soeg[]='/^[^\d]*(\d+)[^\d]+(\d+)[^\d]+(\d+)[^\d]*$/'; $erstat[]='$1-$2-$3';
// Deler 8 cifre op som XXXX-XX-XX $soeg[]='/^[^\d]*(\d{4})(\d{2})(\d{2})[^\d]*$/'; $erstat[]='$1-$2-$3';
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.